php - Apache ErrorDocument 指令不重定向

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

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

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

   ErrorDocument 403 /errors.php

如果这是实现绝对自定义错误处理的错误方法,请告诉我,我将不胜感激您在正确的方向上的插入。

谢谢!

编辑: 哦,我只是想提一下这个。我编写了自己的 MVC 结构来重定向请求,并且效果很好。在 PHP 中,如果用户请求不存在的 URL,我自己的 404 错误将正常触发(或我定义的任何其他错误)。所以基本上,如果我输入 mysite.com/!!!!输入 URL,它会起作用,并且我得到 404。但是,每当我使用双引号字符启动请求时,都会触发默认的 Apache 403 错误。奇怪的。此外,500 错误也将无法重定向到 error.php,并且只会返回默认的 Apache 500 屏幕(例如,使用 header("HTTP/1.0 500 Internal Server Error");die(); 进行测试时) .

编辑3:我只是尝试将ErrorDocument 200“message”放入我的.htaccess文件中,但没有发生任何事情,我打开的任何页面都可以正常打开。最坏的情况是,这应该陷入无限循环。最好的情况,它应该输出“消息”。它什么也没做,它只是忽略了 ErrorDocument。 Apache 的访问日志记录了一个正常的 200 OK header ,但 .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 文档:

Although most error messages can be overriden, there are certain circumstances where the internal messages are used regardless of the setting of ErrorDocument. In particular, if a malformed request is detected, normal request processing will be immediately halted and the internal error message returned. This is necessary to guard against security problems caused by bad requests.

<小时/>

编辑:如何在 Apache 中模拟 500 错误。我的第一个想法是 .htaccess 中的语法错误,但这不会触发自定义错误处理程序。我发现的最简单的方法是通过添加以下行在 .htaccess 中启用 CGI:

ErrorDocument 500 /500.php
Options +ExecCGI
AddHandler cgi-script .pl

然后添加一个崩溃的 perl 脚本:

#!/usr/bin/perl
safasfdsfdd_(*EYFIUOBAF(_*AS^FD_(*AWHD{

您需要确保 apache 用户可以执行 perl 脚本。这显示了我的自定义 500 处理程序。

但是,使用 PHP 时您不太可能触发 Apache 500,因此这可能不是一个有用的测试。

关于php - Apache ErrorDocument 指令不重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5765319/

相关文章:

php - 在 RAINTPL 3 中将 HTML 作为变量传递

php - 如何在灯箱画廊中将图像下方的文本居中?

linux - Apache - 将流量从别名重定向到端口

python - 如何修复Python Neat Openai Retro中的配置错误

ios - Swift Firebase 通知 "libc++abi.dylib: terminating with uncaught exception of type NSException"

php - Laravel数据库innerjoin表的主键不显示

php - 被摘要斯诺克 - PHP

php - htaccess 将别名重定向到主域

java - Apache Tomcat 执行 Java 类

node.js - Heroku 上的生产构建中显示开发构建错误