我在.htaccess文件中有一堆ErrorDocument指令,以便捕获几乎所有Apache可能抛出的错误,并将所有用户redirect到错误控制器,从而以更友好的方式呈现错误。 但是,这似乎不工作。
例如,当我input一个无效的URL,如mysite.com/""##$##$! 我总是得到Apache的默认403错误信息,而不是redirect到我的errors.php文件。 以下是我正在使用的指令。 我需要做其他事情吗? (AllowOverride All设置)
ErrorDocument 403 /errors.php
如果这是错误的方式来处理绝对自定义error handling,请让我知道,我将不胜感激向正确的方向。
谢谢!
编辑:哦,只是想我会提到这一点。 我写了自己的MVC结构redirect请求,它运作良好。 从PHP内部,如果用户请求一个不可靠的URL,我自己的404错误会触发很好(或任何其他我已经定义的错误)。 所以基本上,如果我inputmysite.com /! 到URL,它将工作,我得到了一个404。但是,每当我开始与双引号字符的请求,默认的Apache 403错误触发。 奇。 此外,500错误也将无法redirect到errors.php,并且将简单地返回默认的Apache 500屏幕(例如,当使用头部(“HTTP / 1.0 500 Internal Server Error”)进行testing时); die();) 。
编辑3:我只是试图把我的.htaccess文件中的ErrorDocument 200 "message"
,什么都没有发生,我打开的任何页面正常打开。 最坏的情况下,这应该陷入无限循环。 最好的情况下,它应该输出“消息”。 它既没有,也只是忽略了ErrorDocument。 Apache的访问日志logging了一个普通的200 OK头文件,然而它被.htaccess完全忽略了。
这个问题有几个不同的错误概念。 以下PHP代码:
header("HTTP/1.0 500 Internal server Error"); die();
将永远不会触发一个Apache错误页面 – 这是触发您的浏览器的默认错误页面。 一旦控制权交给PHP,它不会返回到Apache进行错误处理。
ErrorDocument只适用于错误代码,而不是成功代码。 这是在文档中
Syntax: ErrorDocument error-code document
http://httpd.apache.org/docs/current/mod/core.html#errordocument
如果您错误地认为某种浏览器错误页面是服务器错误,那么这也可能是您主要问题的原因。 除非您的自定义错误处理程序输出一定数量的数据,否则某些浏览器将始终显示自己的错误页面。 确保你的输出至少有几千字节的大小。
您的问题的原因很可能只是Apache的内置行为与您选择的测试URL相结合。 从ErrorDocument文档:
尽管大多数错误消息都可以被覆盖,但是在某些情况下,不管ErrorDocument的设置如何,都使用内部消息。 特别是,如果检测到格式错误的请求,正常的请求处理将立即停止并返回内部错误消息。 这是必要的,以防止不良请求引起的安全问题。
编辑:如何在Apache中模拟500错误。 我的第一个想法是在.htaccess
语法错误,但是这不会触发自定义错误处理程序。 我发现的最简单的方法是通过添加这些行来在.htaccess
启用CGI:
ErrorDocument 500 /500.php Options +ExecCGI AddHandler cgi-script .pl
然后添加一个崩溃的perl脚本:
#!/usr/bin/perl safasfdsfdd_(*EYFIUOBAF(_*AS^FD_(*AWHD{
你将需要确保perl脚本是由apache的用户执行的。 这显示我的自定义500处理程序。
但是,使用PHP时,你不可能触发Apache 500,所以这可能不是一个有用的测试。
我只是使用.htaccess所有自定义错误页面
ErrorDocument 401 /error/PHP/server-error.php?error=401 ErrorDocument 403 /error/PHP/server-error.php?error=403 ErrorDocument 404 /error/PHP/server-error.php?error=404 ErrorDocument 500 /error/PHP/server-error.php?error=500 ErrorDocument 503 /error/PHP/server-error.php?error=503