【问题标题】:Mod-Rewrite rules are breaking 404 routingMod-Rewrite 规则正在破坏 404 路由
【发布时间】:2012-11-19 02:03:18
【问题描述】:

我在我的.htaccess 文件中使用了以下mod-rewrite

RewriteRule ^$ pages/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ pages/$1 [L]

其目的是隐藏名为/pages/ 的子目录,使其不显示在 URL 中。

所以这个:http://mysite.com/pages/home.html

看起来像这样:http://mysite.com/home.html

它有效,但有一些意想不到的后果。

由于我在上面发布的.htaccess 代码的直接结果,我的 404 路由不再有效。任何应该触发 404 错误页面的东西都会生成 500 Server Error

如何解决?


编辑:

如上所述,自定义 404 页面是否在 .htaccess 中定义并不重要。没有它,或者错误页面的路径不正确,服务器仍应路由到其默认的 404 页面,而不是提供500 Server Error

当然,必须有一种标准方法来抑制 URL 的各个部分,而不会破坏 404 错误的正常路由。 从我的在线研究看来,我上面的方法通常会破坏 404 路由,并且但到目前为止,我还没有看到适用的解决方案。 (这不是 Wordpress 安装;只是静态 HTML 内容)


编辑 2:

由于我只想抑制 URL 中的一个目录,我从未提到我还有其他文件和目录,它们是 /pages/ 的兄弟,不能指向 /pages/,例如 /graphics//includes//css//cgi-bin/robots.txtfavicon.ico

也许这一切都是徒劳的,或者比它的价值更多的麻烦?

无论哪种方式都在寻找明确的答案。

【问题讨论】:

  • 你为什么不把 /pages/ 的内容移动到 / ?
  • 谢谢@max_,我当然考虑过。答案是:因为我想让我的系统在逻辑上井井有条,我的静态内容都集中在一个位置。如果真的没有可行的解决方案,那么在 URL 中显示 /pages/ 并不是世界上最糟糕的事情。

标签: apache .htaccess mod-rewrite http-status-code-404


【解决方案1】:

以下配置将在pages/ 中查找您的静态页面,如果找到,它将显示它们。这不应该破坏 404。 把它放在你网站的根文件夹.htaccess

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/pages/%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}/pages/%{REQUEST_URI} -d
RewriteRule ^(.*)$ /pages/$1

【讨论】:

  • 是的,非常接近!它适用于/subdirectory/anyPage.html,但在/subdirectory/ 上出现404 失败,通常默认为/subdirectory/index.html
  • 你比我自己的答案早了几秒钟......所以你赢得了复选标记。
  • @Sparky672 呵呵。干杯! :-)
  • @KamilŠrot 不知道我是怎么错过的,但你把我从一个不眠之夜救了出来。我花了至少 2 个小时才弄清楚我应该简单地检查文件是否存在于目标文件夹中。谢谢
【解决方案2】:

这应该可以实现您想要做的事情。

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9\_\-]+)\.html$
RewriteRule (.*) /pages/$1 [L]

【讨论】:

    【解决方案3】:

    感谢@Kamil Šrot 获得最接近的工作解决方案。但是,我需要添加另一个测试 (-d) 以查看请求的 URI 是否为目录。

    这很好,404 error 页面再次正确路由。

    RewriteEngine On
    RewriteBase /
    RewriteCond %{DOCUMENT_ROOT}/pages/%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}/pages/%{REQUEST_URI} -d
    RewriteRule ^(.*)$ /pages/$1
    

    【讨论】:

      【解决方案4】:

      如何将错误页面方向添加到您的htaccess 文件以处理 404 页面:

      ErrorDocument 404 /path/to/your/404.html
      

      【讨论】:

      • 我已经有了。它是否存在并不重要。即使删除了该行,服务器也会给出 500 而不是默认的 404。
      猜你喜欢
      • 2011-07-20
      • 2019-03-05
      • 1970-01-01
      • 2019-08-15
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      相关资源
      最近更新 更多