![如何从 Apache 提供 410 而不是 404](https://linux22.com/image/503568/%E5%A6%82%E4%BD%95%E4%BB%8E%20Apache%20%E6%8F%90%E4%BE%9B%20410%20%E8%80%8C%E4%B8%8D%E6%98%AF%20404.png)
在我们的网站上,我们倾向于删除大量内容已过期的页面,并且我们希望对服务器上不存在的页面(物理文件)的请求返回 http 状态 410 而不是 404(整个网站由静态文件组成)。
我们已尝试
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ - [G,L]
从这篇博文但这会破坏我们整个网站,每个请求都会返回 410。
我们正在使用 Apache 2.2.3
答案1
Redirect gone /path/to/resource
是正确的做法。如果这导致错误,请确保您已mod_alias
在服务器中加载。
答案2
我认为克里斯的回答非常好。如果你不想使用 PHP 脚本,它可以变成:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ - [G,L]
不要忘记mod_rewrite页面还有一个同伴mod_rewrite 维基。
答案3
创建一个errorpage.php(或任何脚本语言)并让该文件返回一个http状态标头:410 Gone,然后将以下内容添加到您的apache配置中,该配置基本上表示如果请求的url不是文件也不是目录(即文件不存在),则加载errorpage.php文档。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /errorpage.php [L]
errorpage.php 可能很简单,例如:
<?php header($_SERVER['SERVER_PROTOCOL'].' 410 Gone');
您还可以让 errorpage.php 包含已删除页面的列表(或其他跟踪方式),以便它可以根据资源是否先前存在正确返回 404 或 410 http 状态。