php - .htaccess 和错误页面 - 留在页面上,不要重定向

标签 php .htaccess http apache2 custom-error-pages

这看起来很简单。 ErrorDocument 重定向到另一个页面:

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

最佳答案

你必须有一个规则来避免像这样重写真实的文件/目录:

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]

我还删除了一些多余的规则。

关于php - .htaccess 和错误页面 - 留在页面上,不要重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26447896/

相关文章:

php - 转义数组值中的引号或特殊字符

php - 有没有办法在 Linux 中使用 xdebug 而不编译源代码?

.net - 如何处理 "no action required"HTTP 响应

.htaccess - htaccess 重写目录

angular - HTTP错误的响应主体内的对象

http - IIS 7.5 似乎没有使用动态压缩

php - 从 HTML 页面(MS Word 类型页面)创建一本书

javascript - Ajax上传图片

php - Android Chrome Data Saver 导致网站问题

apache - htaccess - 删除 index.php 并保留一个没有键的变量