2012-08-14 44 views
3

我想重定向在URL中使用了错误的查询字符串,以自定义错误页,同时通过的.htaccess指令如何重定向错误的查询字符串定制的errorPage + 404状态

ErrorDocument 404 http://www.domain.com/404.php 
给予404种状态的用户

编辑:这不给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中使用了错误的查询字符串将用户重定向到自定义错误页,同时还通过给404个状态.htaccess指令ErrorDocument,或者这是不可能的?

回答

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

header ("HTTP/1.0 404 Not Found"); 
include ('/path/to/404.php'); 

编辑的PHP脚本:如果使用第一种方法(重定向),并希望将$ _GET传递给脚本,以便确定它有什么问题,您可以执行此操作。

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

如果包含404.php文件,然后在$ _GET将提供给它已经

+0

实际上,你可以使用重写规则返回[R = 404],就像您301/302在htaccess中重定向,但它听起来像无效的查询字符串逻辑最好在PHP中处理。但是,如果在htaccess中正确定义(并允许)ErrorDocument 404,则PHP 404头应该足以显示在htaccess中指向的自定义错误页ErrorDocument – WebChemist 2012-08-14 06:46:11

+0

我刚刚尝试确保PHP不会重定向到404页如果你只是发送一个404头。你必须自己处理它。 – GordonM 2012-08-14 07:10:37

+0

我怀疑我的计划是不可能的,因为.htaccess没有被请求再次传递,因为资源通过正在执行的PHP脚本来定位。你最后的建议对我来说看起来不错,但是当我查看access.log时,状态不是404而是302,它只是跳过它看起来的第一个标题命令。 @webchemist:在.htaccess中,我无法检查查询字符串是否有效,因为页面来自数据库,并且.htaccess中的正则表达式无法通过检索要比较的正确值来构建。 – 2012-08-14 07:30:05

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响应,因此piders ...

而且对任何人碰到这个奇怪的到来大约在戈登的答复意见中提到的htaccess的404重定向,你会使用这样的:

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