【问题标题】:Need to specify full URL in .htaccess?需要在 .htaccess 中指定完整的 URL?
【发布时间】:2012-07-18 12:16:12
【问题描述】:

我的 .htaccess 文件中有以下行,它可以工作。

ErrorDocument 404 http://localhost/error.php?code=404

当我将它更改为其中任何一个时,它不再起作用(不知道哪个是正确的):

ErrorDocument 404 error.php?code=404
ErrorDocument 404 /error.php?code=404

.htaccess 文件和error.php 在同一个目录下。为什么会这样?

注意:我在 Wampserver 上

完整的 .HTACCESS 文件

RewriteEngine on

RewriteRule ^([a-z]+)$ $1.php

ErrorDocument 404 http://localhost/error.php?code=404

【问题讨论】:

  • 完整展示您的.htaccess

标签: .htaccess wampserver errordocument


【解决方案1】:

这不起作用的原因是查询字符串。

如果您没有为 ErrorDocument 指令提供完整的 URL,Apache 会将其视为相对于 DocumentRoot 的本地文件路径。有点令人困惑的是,您确实需要使用前导 /,即使它在技术上是相对路径。

现在,您想要做的实际上并不像表面上看起来那么简单。因为您现在处理的是本地路径,所以查询字符串部分不再具有特殊含义,并将被视为文件名的文字部分 - 显然该文件不称为error.php?code=404,它只是称为@987654325 @。值得庆幸的是,有一点点混乱是可能的,因为ErrorDocument 确实会生成一个通过标准路由引擎传递的内部请求。我们在这里需要一点mod_rewrite 魔法。

尝试以下方法:

ErrorDocument 404 /error-404.php

RewriteEngine On
RewriteRule ^/?error-([0-9]+)\.php$ /error.php?code=$1 [L,QSA]

这假设您的 .htaccess 和 error.php 文件都驻留在 DocumentRoot 中。

【讨论】:

  • 发生了什么?检查 Apache 日志...此外,如果您显示文件相对于文档根目录的位置,我可以根据您的情况定制上述代码。
  • 它只是看起来忽略了规则。 apache 日志说找不到文件(我尝试了 localhost/something,它试​​图找到 something.php,但这是正常的)。
  • @RichardG 您能否展示您的文件系统布局以及这些文件相对于 DocumentRoot 的位置?
  • 文件存储在 Wampservers www 文件夹中
  • 所以他们都在www而不是例如www/subfolder?
【解决方案2】:

在我看来,404(如 403、502、...)代码是 HTTP 代码,因此在您的情况下引用 HTTP 进程的指令 ErrorDocument 可能是逻辑需要 http:// 指令。

【讨论】:

    【解决方案3】:

    使用 DaveRandom 的解决方案,我只需将 R 标志添加到 RwriteRule 即可。

    试试这个配置:

    ErrorDocument 404 /error-404.php
    
    RewriteEngine On
    RewriteRule ^/?error-([0-9]+)\.php$ /error.php?code=$1 [L,R,QSA]
    

    对我来说,它适用于 Apache 2.4.12

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多