如何从Apache而不是404服务410

在我们的网站上,我们倾向于在内容已经过期的地方大量地移除页面,并且我们希望返回http状态410而不是404请求页面(物理文件),这些页面在我们的服务器上不存在(整个站点是由静态文件)。

我们尝试过了

RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^.*$ - [G,L] 

从这个博客文章,但只是打破了我们的整个网站,为每个请求服务410。

我们正在使用Apache 2.2.3

  Redirect gone /path/to/resource 

是正确的方法来做到这一点。 如果这对您造成错误,请确保您已在服务器中加载了mod_alias

我相信克里斯的答案相当好。 如果你不想使用PHP脚本,它可能会变成:

 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ - [G,L] 

不要忘了, mod_rewrite页面也有一个compainion mod_rewrite wiki 。

创build一个errorpage.php(或任何脚本语言),并让该文件返回一个HTTP状态头:410 Gone,并添加到您的apacheconfiguration,基本上说,如果请求的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状态,这取决于资源是否已经存在。