需要在.htaccess中指定完整的URL?

时间:2012-07-18 12:16:13

标签: .htaccess wampserver errordocument

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

FULL .HTACCESS FILE

RewriteEngine on

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

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

3 个答案:

答案 0 :(得分:1)

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

如果您没有提供ErrorDocument指令的完整URL,则Apache会将其视为相对于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

答案 1 :(得分:0)

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

答案 2 :(得分: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