我想在我的网站上实现一个自定义的错误 400 页面tikolu.net
,并将其保存到400.php
名为 的文件夹中error
。
我尝试的第一件事就是直接将其放入ErrorDocument 400 /error/400.php
我的.htaccess
文件中。这不起作用,因为对于 400 之类的错误,文件无法处理.htaccess
,而必须将其放入文件中httpd.conf
,如上所述这里。
从 Apache 认可的意义上来说,这是可行的,但仍然没有完全发挥作用。默认消息仍然显示,但这次在底部添加了以下内容:Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request.
这是因为ErrorDocument
没有重定向,而只是重写 URL,同时尝试显示400.php
。但由于这只是重写,Apache 仍然认为请求的文档与最初导致错误的文档相同,因此再次导致 400 错误。
我所能得到的最远的结果是说ErrorDocument 400 https://tikolu.net/error/400.php
。这有效,因为 Apache 无法再次重写 URL(因为它是外部 URL),并且被迫重定向。但是,这对我来说不起作用,因为我需要知道导致错误的原始 URL。我尝试$_SERVER["HTTP_REFERER"]
从 PHP 获取,但它是空的。
该ErrorDocument
指令可以访问一些变量,REDIRECT_URL
但是只有当目标是内部时才会设置它们,所以在这种情况下它不起作用。
是否有可能使用ErrorDocument
但带有适当的重定向,以便可以由 PHP 脚本处理,而不会重复错误?如果没有,是否有办法在重定向到外部位置时使用指令的变量?
.htaccess
以下是我的文件的内容:
RewriteEngine On
IndexOptions +Charset=UTF-8
# REMOVE www FROM URL
<If "%{HTTP_HOST} == 'www.tikolu.net'">
RedirectMatch (.*) https://tikolu.net$1
</If>
# REDIRECT HTTP TO HTTPS
<If "%{HTTPS} == 'off'">
RedirectMatch (.*) https://tikolu.net$1
</If>
# BLOCK .listing FILE
<Files ~ "\.listing$">
Require all denied
</Files>
# DIRECTORY INDEXES
DirectoryIndex index.php index.html
# ERROR DOCUMENTS
ErrorDocument 404 /error/404.php
ErrorDocument 403 /error/403.php
# REDIRECTS
(随后出现各种重定向,格式均为RewriteRule location$ /destination [L]
)
我已暂时禁用我的.htaccess
文件(通过重命名),但问题仍然存在。
编辑:我设法找到了一个稍微有点奇怪(但有效)的解决方法:
ErrorDocument 400 '<meta http-equiv="refresh" content="0; URL=/error/400.php">'