php - Index.php 作为自定义错误页面

标签 php apache .htaccess http-status-codes errordocument

我正在使用 Apache 2.2.X 和 PHP 5.2.X(作为 Apache 模块安装)来构建一个新网站,我想阅读您关于如何处理服务器错误的建议。
我正在考虑使用主页的同一文件(/index.php)来显示自定义错误消息。 这是我的 .htaccess 设置:

ErrorDocument 400 /index.php?error=400
ErrorDocument 401 /index.php?error=401
ErrorDocument 403 /index.php?error=403
ErrorDocument 404 /index.php?error=404
ErrorDocument 500 /index.php?error=500

现在,在我的 index.php 文件中,我有一些如下所示的代码:

if (isset($_GET['error']))
    DrawErrorPage($_GET['error']);
else
    DrawHomepage();

一切都像魅力一样。
好吧,除了一件事我无法修复:如果我强制 Apache 以 500 状态代码响应(例如,将格式错误的代码插入到我的 .htaccess 中),我没有被重定向到“/index.php?error=500”,但我得到了默认的 500 错误页面。对于任何其他状态代码(例如 403 或 404),我的配置绝对完美。

但现在我有疑问,我开始认为使用另一个页面会更好处理错误(例如,“/error.php”)。
“DrawHomepage()”需要将“robots”元标记设置为“index, follow”,而“DrawErrorPage()”需要将其设置为“无索引,无跟随”。正确的?那么...如果网络爬虫第一次访问我的主页时收到错误响应,会发生什么情况?如果网络爬虫第一次访问我的主页的次数为 200,但一个月后访问次数为 500,会发生什么情况?如果我将“机器人”元标记保留为“索引,跟随”,即使我显示错误,会发生什么?

对于这个问题有解决方法吗?你会做什么?

非常感谢!

最佳答案

通常,如果有 500 状态代码,则 Apache 已经搞砸了,并且它无法运行您的 index.php 文件,从而导致另一个 500 状态代码。 Apache 继续这个错误循环几次迭代,然后最终说“不再循环”并发送自己的错误页面。

显示 500 状态代码的自定义页面的唯一真正安全的方法是使用纯文本或使用不会尝试访问服务器上其他内容的基本 .html 或 .shtml 文件,因此您不需要不要在页面加载中不断触发超过 500 个状态代码。

通常,如果爬虫遇到500,它只会暂时忽略该页面。 500代码是可以恢复的,这并不一定意味着那里没有页面,只是服务器现在出了问题。这些机器人很聪明,只要页面始终发送页面标题中的状态代码,就可以确定错误代码的含义。

请记住,如果您使用 PHP 文件作为错误文档,则需要使用 PHP 内部的 header 函数重新发送 HTTP 状态代码,以确保正确的页面检测,如下所示:

header("HTTP/1.1 404 Page Not Found");

关于php - Index.php 作为自定义错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8498334/

相关文章:

PHP:将月份添加到日期,但不超过该月的最后一天

php - 如何访问实体属性的原始值?

php - Laravel 登录一次,可登录多个子域

apache - 我可以在同一台计算机上托管多个网站吗?

apache - 使用 .htaccess 删除 URL 中不需要的部分

php - 将空的 $_POST 数据更改为 NULL 的快速方法

php - 如何在多个查询中进行多个字符串替换?

r - Rstudio的Shiny可以使用Apache Proxy Websockets吗?

apache - .htaccess - 如何根据环境变量设置自定义 header ?

php - 如何从网站 https 端的 httpdocs 加载文件