3

我的 .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
4

3 回答 3

1

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

当您没有为ErrorDocument指令提供完整的 URL 时,Apache 将 is 视为相对于DocumentRoot. 有点令人困惑的是,您确实需要使用前导/,即使它在技术上是相对路径。

现在,您想要做的实际上并不像表面上看起来那么简单。因为您现在处理的是本地路径,所以查询字符串部分不再具有特殊含义,并将被视为文件名的文字部分 - 显然该文件没有被调用error.php?code=404,它只是被调用error.php。不过值得庆幸的是,有一点点乱七八糟是可能的,因为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.

于 2012-07-18T12:30:45.197 回答
0

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

于 2012-07-18T12:27:32.750 回答
0

使用 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

于 2015-11-04T09:26:08.460 回答