我想将使用URL中错误查询字符串的用户重定向到自定义错误页面,同时通过.htaccess指令提供404状态
ErrorDocument 404 http://www.domain.com/404.php
编辑:这不会给404而是302! “http://www.domain.com” 导致重定向。只需本地路径即可获得404.另请参阅http://httpd.apache.org/docs/2.0/mod/core.html#errordocument
因此我在请求接收index.php中创建了一个脚本,用于确定查询字符串是否无效,如果是,则给出以下命令:
header("HTTP/1.0 404 Not Found");
但这并不是通过.htaccess指令ErrorDocument重定向,而只是给访问者一个404状态。
使用header("Location: 404.php")
时,您获得302状态,使用header("Location: 404.php", true, 404)
时状态为404,但不会转到自定义404.php页面。
现在我用
header ("Location: ", true, 404);
echo "The URL you use doesn't lead to an existing page, etc.";
但这不是最初的计划......我如何让使用URL中错误的查询字符串的用户重定向到自定义错误页面,同时通过.htaccess指令ErrorDocument提供404状态,或者这是不可能的?
答案 0 :(得分:4)
据我所知,从PHP显示404页面的唯一方法是显式重定向到它。原因是Apache(或您正在使用的任何Web服务器)已经成功找到了指向客户端的资源(正在执行的PHP脚本)。如果PHP脚本无法解析客户端的请求,那么它必须处理404标头的发送并显示页面本身。
您可以重定向
header ("HTTP/1.0 404 Not Found");
header ('Location: http://' . $_SERVER["SERVER_NAME"] . '/404.php');
或者您可以将404页面包含在想要触发404的PHP脚本中。
header ("HTTP/1.0 404 Not Found");
include ('/path/to/404.php');
编辑:如果您使用第一种技术(重定向)并希望将$ _GET传递给脚本以便它可以确定它的错误,您可以执行此操作。
header ("HTTP/1.0 404 Not Found");
header ('Location: http://' . $_SERVER["SERVER_NAME"] . '/404.php?' . http_build_query ($_GET));
如果你包含404.php文件,那么$ _GET已经可以使用了
答案 1 :(得分:1)
显示自定义404页面并使用标题刷新获取状态404的替代解决方案:
header("refresh:0;url=/404.php",TRUE,404);
然而,这不是标准行为,因为您实际上是将用户重定向到www.domain.com/404.php,而不是在坏网址下显示404页面(例如www.domain.com/index.php?q= badrequest)就像Apache ErrorDocument一样,虽然我不确定它对搜索引擎蜘蛛是否重要,因为原始网址仍然返回404响应......
对于遇到这种对Gordon的回答评论中提到的htaccess 404重定向感到好奇的人,你会像这样使用它:
RewriteRule ^(match conditions)$ - [R=404,NC,L]