Php 如何将错误的查询字符串重定向到自定义错误页面+;404状态

Php 如何将错误的查询字符串重定向到自定义错误页面+;404状态,php,.htaccess,Php,.htaccess,我想将在URL中使用错误查询字符串的用户重定向到自定义错误页面,同时通过.htaccess指令提供404状态 ErrorDocument 404 http://www.domain.com/404.php 编辑:这不是404而是302!!!"http://www.domain.com" 导致重定向。仅本地路径给出404。另见 因此,我在request receiving index.php中创建了一个脚本,用于确定querystring是否无效,如果无效,则给出以下命令: header("HT

我想将在URL中使用错误查询字符串的用户重定向到自定义错误页面,同时通过.htaccess指令提供404状态

ErrorDocument 404 http://www.domain.com/404.php
编辑:这不是404而是302!!!"http://www.domain.com" 导致重定向。仅本地路径给出404。另见

因此,我在request receiving index.php中创建了一个脚本,用于确定querystring是否无效,如果无效,则给出以下命令:

header("HTTP/1.0 404 Not Found");
但这不会通过.htaccess指令ErrorDocument重定向,而只是给访问者一个404状态

当使用
标题(“Location:404.php”)
时,您将获得302状态,当使用
标题(“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状态,或者这是不可能的?

据我所知,从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');
编辑:如果您使用第一种技术(重定向),并希望将$\u GET传递给脚本,以便它可以确定它有什么问题,那么您可以这样做

header ("HTTP/1.0 404 Not Found");
header ('Location: http://' . $_SERVER["SERVER_NAME"] . '/404.php?' . http_build_query ($_GET));

如果包含404.php文件,则$\u GET将对其可用

另一种解决方案,用于显示自定义404页面并使用标题刷新获取状态404:

header("refresh:0;url=/404.php",TRUE,404);
但是,这不是标准行为,因为您实际上是将用户重定向到www.domain.com/404.php,而不是像Apache ErrorDocument那样在错误url(如www.domain.com/index.php?q=badrequest)下显示404页面,虽然我不确定这是否会影响搜索引擎蜘蛛,因为原始url仍然返回404响应

此外,对于任何对Gordon的回答评论中提到的htaccess 404重定向感到好奇的人,您可以这样使用它:

RewriteRule ^(match conditions)$ - [R=404,NC,L]

实际上,您可以使用rewriterule返回[R=404],就像在htaccess中使用301/302重定向一样,但听起来无效的查询字符串逻辑最好在php中处理。但是,如果htaccess中正确定义(并允许)了ErrorDocument 404,则php 404头应该足以显示htaccess ErrorDocument中指向的自定义错误页面。我刚刚尝试过这样做,以确保如果只发送404头,php不会重定向到404页面。您必须自己处理它。我已经怀疑我的计划是不可能的,因为请求没有再次传递.htaccess,因为资源是由正在执行的PHP脚本定位的。你的上一个建议对我来说很好,但是当我查看access.log时,状态不是404而是302,它只是跳过了第一个看起来像头的命令@网络化学家:在.htaccess中,我无法检查querystring是否有效,因为页面来自数据库,并且.htaccess中的正则表达式无法通过检索要比较的正确值来生成。你是对的,我记错了。。。但不能使用位置标头重定向,它也会返回: