2014-10-19 125 views
1

这似乎很简单。 ErrorDocument重定向到另一个页面:.htaccess和错误页面 - 留在页面上,不要重定向

RewriteEngine On 

ErrorDocument 400 /err/e=400 
ErrorDocument 401 /err/e=401 
ErrorDocument 403 /err/e=403 
ErrorDocument 404 /err/e=404 
ErrorDocument 500 /err/e=500 

但是这些自定义错误页的问题是,浏览器实际上重定向到/err/e=404的页面,而不是仅仅显示其内容。不使用自定义错误页面时,浏览器中的URL保持不变,因此用户无需再次键入即可更正URL。

问题:如何创建自定义错误页面,这些页面改变URL,并把它像domain.tld/nonexistantfile

背景:使用Debian Wheezy,Apache2和PHP。

更新发布整个.htaccess文件

RewriteEngine On 

ErrorDocument 400 /err/e=400 
ErrorDocument 401 /err/e=401 
ErrorDocument 403 /err/e=403 
ErrorDocument 404 /err/e=404 
ErrorDocument 500 /err/e=500 

RewriteRule ^favicon.ico$ favicon.ico [L] 
RewriteRule ^css/(.*) css/$1 [L] 
RewriteRule ^downloads/(.*) downloads/$1 [L] 
RewriteRule ^images/(.*) images/$1 [L] 
RewriteRule ^js/(.*) js/$1 [L] 

RewriteRule index.php(.*) index.php$1 [L] 
RewriteRule ^(.*)/(.*=.*) index.php?controller=$1&$2 [L] 
RewriteRule ^(.*=.*) index.php?$1 [L] 
RewriteRule ^(.*) index.php?controller=$1 [L] 

最后一部分使URL的喜欢/homepage1/page2/param=123

+0

没有这些'ErrorDocument'不会让浏览器重定向到'/ err/e = 404'。你可能会有一些冲突的规则造成这种情况。你能发布完整的.htaccess吗? – anubhava 2014-10-19 06:33:19

+0

在这里,你去。 :) – bytecode77 2014-10-19 06:36:22

回答

1

你必须有一个规则,以避免这样的真正的文件/目录重写:

ErrorDocument 400 /err/e=400 
ErrorDocument 401 /err/e=401 
ErrorDocument 403 /err/e=403 
ErrorDocument 404 /err/e=404 
ErrorDocument 500 /err/e=500 

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule^- [L] 

RewriteRule ^([^/]+)/([^=]+=.*)$ index.php?controller=$1&$2 [L,QSA] 
RewriteRule ^([^=]+=.*)$ index.php?$1 [L,QSA] 
RewriteRule ^(.+)$ index.php?controller=$1 [L,QSA] 

我也删除了一些冗余规则。

+0

你删除了多余的东西太棒了!但它仍然重定向到'/ err/e = ...',我甚至从一个没有看到该站点的虚拟环境进行测试,以避免缓存问题。 – bytecode77 2014-10-19 06:50:23

+0

在另一个浏览器中测试,并在Firebug中测试它,看看你在Net标签中得到了什么重定向。也可能是'/ err/e = 400'正在通过代码重定向? – anubhava 2014-10-19 07:14:37

+0

调用一个不存在的文件实际上会导致一个'302 Found'错误,因此它会重定向。它实际上应该会导致404错误。 '/ err/e = 404'页面以普通的200响应。 – bytecode77 2014-10-19 07:18:07