13

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

例如,当我输入一个无效的 URL 时,例如 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 屏幕(例如,使用 header("HTTP/1.0 500 Internal Server Error");die(); 进行测试时) .

编辑 3:我只是尝试放入ErrorDocument 200 "message"我的 .htaccess 文件并没有发生任何事情,我打开的任何页面都可以正常打开。在最坏的情况下,这应该会陷入无限循环。最好的情况下,它应该输出“消息”。它也没有,它只是忽略了ErrorDocument。Apache 的访问日志记录了一个正常的 200 OK 标头,但 .htaccess 完全忽略了它。

4

2 回答 2

28

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

于 2011-04-30T02:34:54.873 回答
-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
于 2011-07-06T01:54:52.543 回答