[英].htaccess - R=404 NOT Showing Custom Error Page
我想在用户访问扩展名为.php
的 php 文件时显示错误页面。 但这并没有显示我设置的自定义错误页面。 相反,它显示默认的 Apache 错误页面。
# Run Php without filename extension
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php
# Return 404 if original request is .php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]
# Error Pages
ErrorDocument 404 /error.php
ErrorDocument 403 /error.php
编辑:我知道我可以使用RewriteRule.* /error [L,R]
但我想显示保持相同 URL 的错误页面。 例如,如果用户访问/login.php,他必须停留在/login.php,但这将重定向到/error.php。
我没有找到自动触发自定义错误文档的方法。 R=404
标志显然会导致生成 Apache 的默认错误页面。 甚至PT
| passthrough
对错误页面处理没有影响。
(在Apache/2.4.25 (Debian) / Debian 4.9.135-1 (2018-11-11) x86_64 GNU/Linux 上测试)
一个可行的解决方案是重写错误处理程序文件的路径而不是执行redirect ,但是,这会将状态代码错误地设置为200
。
RewriteRule ^ error404.php [END]
http_response_code()
和$_SERVER['REDIRECT_STATUS']
都将为200
(int / string type) 。 您需要自行在 PHP 中设置状态码。
$previous_status = http_response_code(404);
如果您计划拥有一个包罗万象的错误处理程序,您可以将状态写入映射到$_SERVER
变量的环境。
RewriteRule ^ error.php [E=INTENDED_STATUS:404,END]
在这种情况下$_SERVER['REDIRECT_INTENDED_STATUS']
将是404
。 我已经测试过设置E=STATUS:404
,但是$_SERVER['REDIRECT_STATUS']
被200
覆盖。 'REDIRECT_'
前缀由 mod_rewrite 自动添加。
我迟到了这个问题,因为就在今天我遇到了同样的问题并研究了我遇到的另一个问题,我找到了解决这个问题的方法。
您所要做的就是在规则之前加上一个条件(在您的情况下是第二个条件):
RewriteCond% {ENV: REDIRECT_STATUS} ^ $
仅此而已
对于和你一样的问题,我的代码如下:
RewriteCond% {ENV: REDIRECT_STATUS} ^ $
RewriteRule ^ (. *) \. Php $ - [R = 404, L]
解释是条件阻止创建循环(因此是默认错误)。 当我们将对某些 php 文件的所有直接访问重定向到 404 错误时,该错误又是一个 php 文件,该条件会阻止创建循环,因为它会检查是否存在对该文件的重定向。
对不起,语言不好,但我几乎不会说。
问候
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.