我可以让 Apache ErrorDocument 返回 404 而不是 301 吗?

我可以让 Apache ErrorDocument 返回 404 而不是 301 吗?

在我的.htaccess我有

ErrorDocument 404 http://foo.com/404.html

它可以工作,因为我可以从任何文件未找到错误中恢复并显示 404 页面,但它的工作方式是使用 301 将错误的 URI 重定向到我的404.html页面。

这很糟糕,因为搜索引擎和爬虫最终不会看到 404 代码,而是 301 代码,并且不会从其索引中清除已删除的页面。

我可以让 Apache 在出现文件未找到错误时提供此 404 页面的内容,但仍然返回 404 代码而不是 301 吗?

答案1

您应该尝试使用绝对路径或相对路径,而不是 URL

我的apache2.conf:

ErrorDocument 403 /error/403.html
ErrorDocument 404 /error/404.html
ErrorDocument 500 /error/500.html

答案2

不要指向外部 URL

Apache 的文档说

语法是,

ErrorDocument <3-digit-code> <action>

可以采取的行动是,

  • 要显示的文本。使用引号 (") 将文本括起来。
  • 要重定向到的外部 URL。
  • 重定向到的本地 URL。

指向外部 URL 将导致实际重定向,而使用本地 URL 是内部的。

因此,要呈现文件的内容,只需指向它,例如:

ErrorDocument 404 /404.html

使用正确的状态代码

这很糟糕,因为搜索引擎和爬虫最终不会看到 404 代码,而是 301 代码,并且不会从索引中清除已删除的页面

如果页面用过的存在,现在不存在,正确的响应代码是410 已消失. 410 是表示“嘿,那不存在”的代码,而 404 只会在多次尝试访问现在不存在的页面后才会被理解。

答案3

对 Maxence 和 AD7six 的答案的评论(我在 serverfaul 上没有足够的声誉,而且 stack exchange 声誉显然不算数):

我刚刚用这种方式解决了这个问题,但是由于 URL 仍然是用户尝试调用的 URL,因此包含的图片和样式丢失了。

解决方案是在 404 文档的头部添加一个基本标签,例如

ErrorDocument 404

或者使用带有或不带有协议/域名的绝对 URL。

相关内容