当数据库中缺less项目时,PHP或htaccess使dynamicURL页面去404

典型场景:

  1. DB项目显示在页面http://...?item_id=467
  2. 用户有一天删除该项目
  3. Google或用户尝试访问http://...?item_id=467
  4. PHP挖掘到数据库,并看到项目不再存在,所以现在PHP必须告诉谷歌/用户该项目不存在通过404头和页面。

根据这个答案,我承诺没有办法通过PHPredirect到404 Apache页面,除非在代码中发送404头+阅读并向客户端发送您的默认404页面的所有内容。

问题:我已经有一个Apacheparsing的自定义404.shtml页面,所以我想简单地使用该页面。 但是, 如果我通过PHP读取一个shtml页面,它将不会被Apacheparsing了

那么你build议我做什么?

也许有一些技巧我可以使用htaccess吗?

谢谢,

嗯。 想到两个想法:

  • 使用header("Location:...")重定向到404页面 – 虽然这不符合标准。 我只会用它作为最后一根稻草

  • 使用file_get_contents("http://mydomain.com/404.shtml");获取并输出Apache分析的SHTML文件file_get_contents("http://mydomain.com/404.shtml"); – 也不最佳的,因为向Web服务器发出请求,但我认为在大多数情况下都是可以接受的。

我怀疑在.htaccess可以做任何事情,因为PHP脚本在任何重写规则已经被解析之后运行。

如果你使用的是Apache mod_php,使用virtual('/404.shtml'); 将解析的shtml页面显示给你的用户。

我昨天试图做同样的事情。

Pekka的file_get_contents / include是否会导致404状态头被发送? 在包含自定义错误页面之前,可能需要这样做?

 header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); 

你可以测试使用这个Firefox扩展 。

我正在寻找像你需要的东西,所以你有一个页面:

 http://example.com/page?item_id=456 

如果以后你想,如果项目是失踪的,你被重定向到:

 http://example.com/page_not_found?item_id=456 

事实上,我发现这是更多的可维护的解决方案,只是使用原来的页面作为404页面。

 <?php $item = findItem( $_GET['item_id']); if($item === false){ //show 404 page sending correct header and then include 404 message header( $_ENV['SERVER_PROTOCOL'].' 404 Not Found', true ); // you can still use $_GET['item_id'] to customize error message // "maybe you were looking for XXX item" include('somepath/missingpage.php'); return; } //continue as usual with normal page ?> 

因此,如果物品不再位于数据库中,则会显示404页面,但是您可以在替换或错误消息中提供自定义物品。