5

在标准的 LAMP 应用程序中,我使用 .htaccess 规则将人们发送到我的 404 页面,如下所示:

ErrorDocument 404 http://www.mydomain.com/404.php

我们使用从文件系统读取文件的 php 文件来提供动态图像,但我刚刚注意到,当从应用程序中删除图像时,我们并没有选择它,因此请求http://www.mydomain。 com/image_4.jg(例如)使用 mod_rewrite 调用 image.php 不会将用户重定向到 404 页面,因为动态图像文件将始终存在。在这种情况下,我知道我应该使用 404,但我不确定在哪里。

显然,我知道当图像被删除时我需要手动插入标头重定向到 404.php 页面,但我是否应该使用此重定向发送 404 标头?查看代码,我们的 404.php 页面实际上已经发送了一个 404 标头,("HTTP/1.1 404 Not Found");这是我们的 SEO 团队几年前所指示的,不确定这是否正确?这对我来说似乎违反直觉,因为它几乎暗示 404 页面本身尚未找到。

我想这是2个问题:

  • 当找不到图像时,我应该在重定向中发送 404 标头吗?
  • 我的 404 页面是否应该发送 404 标头?

编辑

实际上似乎不可能同时发送 404 和重定向,例如这会导致 Chrome 显示“糟糕!此链接似乎已损坏”。信息

header( "Location: /404.php", true, 404 );

如果你像这样分解标题,它也不能按预期工作

header("HTTP/1.1 404 Not Found");
header("Location: /404.php" );

在这种情况下,如果您查看标头,它会发送一个 302,然后是一个 404。在这种情况下,可能只发送一个没有重定向的标头就足够了吗?也许只是按照某些人的建议发送 410?

4

6 回答 6

3

404 未找到

服务器未找到任何与请求 URI 匹配的内容。没有说明这种情况是暂时的还是永久性的。如果服务器通过一些内部可配置的机制知道旧资源永久不可用并且没有转发地址,则应该使用 410 (Gone) 状态代码。当服务器不希望确切地揭示请求被拒绝的原因或没有其他响应适用时,通常使用此状态代码。

状态码定义

当找不到资源时,应将 404 响应发送回客户端。

当找不到图像时,我应该在重定向中发送 404 标头吗?

是的。这告诉请求动态图像的客户端找不到资源。如果您知道资源永远不会返回,请改用 410 (Gone)。

我的 404 页面是否应该发送 404 标头?

是的。请参阅SEO 的 404 错误页面和重定向

更新

header("HTTP/1.0 404 Not Found");应该足够了;但是,如果内容长度小于 512 字节,Google Chrome 将无法显示自定义 404 页面。

于 2011-10-16T13:07:01.587 回答
2

简单地说:是的,对这两个问题。

从 image.php 发送的 404 标头不会将您重定向到 .htaccess 中指定的 404 错误文档,因此当找不到图像时,您必须手动重定向到 404.php。首选方式是 410(已消失),尤其是因为您知道所请求的资源已被删除且不会返回,因此搜索引擎可以删除该链接。

至于第二个是:应该,尽管 Apache 已经为您做到了。

于 2011-10-16T13:07:09.280 回答
2

ErrorDocument仅当 Web 服务器识别出请求无法映射到现有文件时,才会提供使用该指令定义的错误文档。但是当您使用 mod_rewrite 将它们映射到现有的image.php时,它们显然已经找到了。因此,从 Web 服务器的角度来看,可以满足初始请求。

此时,特定请求是否无法满足并在稍后导致 404 无关紧要。在这种情况下,image.php需要以正确的错误响应进行响应。

当找不到图像时,我应该在重定向中发送 404 标头吗?

您只能发送一个响应状态码。因此,您可以发送错误响应 (4xx) 或重定向响应 (3xx)。在您的情况下,将绝对 URL 作为文档 URL 将产生重定向状态代码(即 302)而不是原始 404。

我的 404 页面是否应该发送 404 标头?

是的当然。这就是状态码的意义所在。

并且还提供有关该错误文档的一些有用信息。没有什么比无意义的错误文档更糟糕的了。

于 2011-10-16T13:31:33.237 回答
2
header("HTTP/1.0 404 Not Found");

您可能希望包含 404 页面,仅发送标题会给您一个空白页面

header("HTTP/1.0 404 Not Found");
include_once("404.html");
exit();
于 2013-07-30T06:44:43.073 回答
1
  1. 我不知道我是否会重定向,我宁愿包括你的 404.php
  2. 那是对的。默认错误页面也存在并发送 404。
于 2011-10-16T13:08:29.560 回答
0
header("HTTP/1.1 404 Not Found");
header("Refresh: 0; url=/404.php");
于 2014-08-07T20:01:58.707 回答