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

发布于 2024-12-21 13:35:03 字数 1011 浏览 2 评论 0原文

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

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

非常感谢!

I'm using Apache 2.2.X and PHP 5.2.X (installed as Apache module) to build a new website and I would like to read your suggestions about how I'm trying to handle server errors.
I was thinking about using the same file of my homepage (/index.php) to show custom error messages.
This is my .htaccess setup:

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

Now, in my index.php file I have some code that looks like this:

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

Everything works like a charm.
Well, everything except one thing that I can't fix: if I force Apache to respond with a 500 status code (for example, inserting malformed code into my .htaccess), I'm not being redirected to "/index.php?error=500", but I get the default 500 error page instead. With any other status code (for example, 403 or 404) my configuration works absolutely perfectly.

But now I've a doubt and I'm starting to think that it would be better to use another page to handle errors (for example, "/error.php").
"DrawHomepage()" needs to set "robots" meta tag to "index, follow", while "DrawErrorPage()" needs to set it to "noindex, nofollow". Right? So... what would happen if a web crawler gets an error response visiting my homepage for the first time? What would happen if a web crawler gets 200 visiting my homepage for the first time, but a 500 visiting it a month later? And what would happen if I keep my "robots" meta tag to "index, follow" even if I'm showing errors?

Is there a workaround, a solution, for this problem? What would you do?

Many thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

左耳近心 2024-12-28 13:35:03

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

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

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

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

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

Usually if there is a 500 status code then Apache has messed something up and it can't run your index.php file, resulting in another 500 status code. Apache continues this error loop for a few iterations before it finally says "no more loops" and sending its own error page.

The only really safe way to display a custom page for a 500 status code is to use plain text or use a basic .html or .shtml file that doesn't try to access other things on your server, so you don't keep triggering more 500 status codes in the page load.

Usually if a crawler encounters a 500, it will just ignore the page temporarily. A 500 code is recoverable, it doesn't necessarily mean there is no page there, just that the server is messed up at the moment. The bots are smart and can determine what error codes mean what, as long as the page is always sending the status code in the page header.

Remember, if you use a PHP file as your error document, you need to resend the HTTP status code using the header function inside PHP to ensure proper page detection, like so:

header("HTTP/1.1 404 Page Not Found");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文