典型场景:
http://...?item_id=467
http://...?item_id=467
根据这个答案,我承诺没有办法通过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页面,但是您可以在替换或错误消息中提供自定义物品。