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

时间:2011-12-14 00:55:35

标签: 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()”需要将其设置为“noindex,nofollow”。对?那么......如果网络抓取工具第一次访问我的主页时收到错误响应,会发生什么?如果网络爬虫第一次访问我的主页有200个访问我的主页会发生什么,但是一个月后访问它的500个会怎样?如果我将“机器人”元标记保持“索引,跟随”,即使我显示错误,会发生什么?

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

非常感谢!

1 个答案:

答案 0 :(得分:4)

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

显示500状态代码的自定义页面的唯一真正安全的方法是使用纯文本或使用基本的.html或.shtml文件,它不会尝试访问服务器上的其他内容,所以你不要t在页面加载中继续触发更多500个状态代码。

通常,如果抓取工具遇到500,它会暂时忽略该页面。 500代码是可恢复的,它并不一定意味着那里没有页面,只是服务器此刻搞砸了。机器人很聪明,可以确定哪些错误代码意味着什么,只要页面始终发送页面标题中的状态代码。

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

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