Apache ErrorDocument指令不重定向

时间:2011-04-23 16:12:09

标签: php apache error-handling custom-error-pages errordocument

我的.htaccess文件中有一堆ErrorDocument指令,以便捕获Apache可以向用户抛出的几乎所有可能的错误,并将所述用户重定向到我的错误控制器,然后在更多用户中呈现错误友好的态度。但是,它似乎不起作用。

例如,当我输入无效的网址时,例如mysite.com/""##$##$!我总是得到Apache的默认403错误消息,而不是重定向到我的errors.php文件。以下是我正在使用的指令。我需要做任何其他事情才能使其发挥作用吗? (已设置AllowOverride All)

   ErrorDocument 403 /errors.php

如果这是接近绝对自定义错误处理的错误方法,请告诉我,我希望在正确的方向上轻推。

谢谢!

编辑: 哦,我以为我会提到这个。我编写了自己的MVC结构来重定向请求,它运行良好。从PHP内部,如果用户请求不存在的URL,我自己的404错误将被解雇(或者我已经定义的任何其他错误)。所以基本上,如果我进入mysite.com / !!!!进入URL,它将工作,我得到一个404.但是,每当我用双引号字符启动请求时,默认的Apache 403错误就会触发。奇。此外,500错误也将无法重定向到errors.php,并且只会返回默认的Apache 500屏幕(例如,使用标头测试时(“HTTP / 1.0 500内部服务器错误”); die();)

编辑3:我刚尝试将ErrorDocument 200 "message"放在我的.htaccess文件中,没有任何反应,我打开的任何页面都正常打开。最糟糕的情况是,这应该陷入无限循环。最好的情况,它应该输出“消息”。它没有做,它只是忽略了ErrorDocument。 Apache的Access Log记录了一个普通的200 OK标题,然而它被.htaccess完全忽略了。

2 个答案:

答案 0 :(得分:27)

问题中存在一些不同的误解。以下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,所以这可能不是一个有用的测试。

答案 1 :(得分:-10)

我只是将.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