在标准的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页面实际上已经发送了一个带有("HTTP/1.1 404 Not Found");
的404标题,这是我们的SEO团队几年前指示的,不确定这是否正确?这对我来说似乎是违反直觉的,因为它几乎意味着404页面本身还没有找到。
我想这是2个问题:
修改
实际上似乎无法同时发送404和重定向,例如这会导致Chrome显示“糟糕!此链接似乎已损坏”。消息
header( "Location: /404.php", true, 404 );
如果你打破这样的标题,它也无法正常工作
header("HTTP/1.1 404 Not Found");
header("Location: /404.php" );
在这种情况下,如果您查看标题,它会发送302后跟404.在这种情况下是否足以发送没有重定向的标题?也许只是按照一些人的推荐发送410?
答案 0 :(得分:3)
服务器未找到与Request-URI匹配的任何内容。没有 指示该条件是暂时的还是 常驻。如果服务器应该使用410(Gone)状态代码 通过一些内部可配置的机制,知道一个旧的 资源永久不可用,没有转发地址。 此状态代码通常在服务器不希望时使用 明确说明请求被拒绝的原因,或者没有其他请求 回应是适用的。
当找不到资源时,应该将404响应发送回客户端。
当图像不是时,我应该在重定向中发送404标头 发现?
是。这告诉客户端请求动态图像找不到资源。如果您知道资源永远不会返回,请改用410(Gone)。
我的404页面实际上应该发送404标头吗?
是。见404 Error Pages and Redirects for SEOs
header("HTTP/1.0 404 Not Found");
应该足够了;但是,如果内容长度小于512字节,则Google Chrome无法显示自定义404页面。
答案 1 :(得分:2)
简单地说:是的,两个问题。
从image.php发送的404标头不会将您重定向到.htaccess中指定的404 errordocument,因此无论何时找不到图像,您都必须手动重定向到404.php。首选方法是410(Gone),特别是因为您知道所请求的资源已被删除且不会返回,因此搜索引擎可以删除该链接。
至于第二个是:它应该,尽管Apache已经为你做了。
答案 2 :(得分:2)
仅当Web服务器识别出请求无法映射到现有文件时,才会使用ErrorDocument
指令定义的错误文档。但是当你使用mod_rewrite将它们映射到现有的 image.php 时,很明显它们就可以了。因此,从Web服务器的角度来看,可以完成初始请求。
此时,如果无法满足特定请求并且稍后导致404无关紧要。在这种情况下, image.php 需要以适当的错误响应进行响应。
如果找不到图像,我应该在重定向中发送404标头吗?
您只能发送一个响应状态代码。因此,您可以发送错误响应(4xx)或重定向响应(3xx)。在您的情况下,将绝对URL作为文档URL将产生重定向状态代码(即302)而不是原始404.
我的404页面实际上应该发送404标头吗?
是的,当然。这就是状态代码的含义。
并且还提供有关该错误文档的一些有用信息。没有什么比无意义的错误文件更糟糕。
答案 3 :(得分:1)
答案 4 :(得分:1)
header("HTTP/1.0 404 Not Found");
您可能想要包含404页面,只发送标题会给您一个空白页面
header("HTTP/1.0 404 Not Found");
include_once("404.html");
exit();
答案 5 :(得分:1)
header("HTTP/1.1 404 Not Found");
header("Refresh: 0; url=/404.php");