2

我正在使用 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()”需要将它设置为“noindex,nofollow”。对?那么......如果网络爬虫第一次访问我的主页时收到错误响应会发生什么?如果网络爬虫第一次访问我的主页有 200 次访问,但一个月后访问了 500 次,会发生什么情况?如果我将“机器人”元标记保留为“索引,关注”,即使我显示错误,会发生什么?

这个问题有解决方法吗?你会怎么办?

非常感谢!

4

1 回答 1

4

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

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

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

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

header("HTTP/1.1 404 Page Not Found");
于 2011-12-14T01:05:02.107 回答