我的.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
答案 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