3

我想将在 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 状态,或者这是不可能的?

4

2 回答 2

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 将对其可用

于 2012-08-14T06:38:16.680 回答
1

显示自定义 404 页面并使用标题刷新获取状态 4​​04 的替代解决方案:

header("refresh:0;url=/404.php",TRUE,404);

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

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

RewriteRule ^(match conditions)$ - [R=404,NC,L]
于 2012-08-14T18:42:10.283 回答