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


How redirect wrong querystring to custom errorpage + 404 status

我想将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

因此,我在请求接收索引中创建了一个脚本.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 状态,或者这是不可能的?

据我所知,从 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 将已经可供其使用

使用

标题刷新显示自定义 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 响应......

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

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