繁体   English   中英

.htaccess - R=404 不显示自定义错误页面

[英].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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM