好吧,所以我尝试使用.htaccess为各种错误代码设置ErrorDocuments。它工作得很好,只是现在,下面的jQueryAJAX代码永远不会运行error()函数:
$.ajax({url: url, type: "GET", cache: false, error: function(){
alert("Looking rather erroneous, are we?");
}, success: function(html){
// ...
}
有什么建议吗?我想我知道为什么:.htaccess会像这样指出所有错误:
ErrorDocument 404 /error.php
/error.php包含以下内容:
<?php header("Location: /#error"); ?>
因此,当它转移到index.php时,它可能会丢失404文档状态。
你有什么建议?
尝试在AJAX请求的同时传递一个标头:
$.ajax({url: url, type: "GET", cache: false, headers: {'X-My-AJAX-Header': 'yes'}, error: function(){
alert("Looking rather erroneous, are we?");
}, success: function(html){
// ...
}
然后您可以在error.php
中检测到,以不同的方式处理AJAX请求中的错误:
<?php
if (isset($_SERVER['HTTP_X_MY_AJAX_HEADER'])) {
header('Status: 404');
} else {
header("Location: /#error");
}
?>
您可能需要试用$_SERVER
密钥。如果您使用的是Apache/mod_php,请参阅apache_request_headers
。
编辑:
需要这样做的原因是,如下所述,header("Location: /#error");
发送一个302(重定向)标头,该标头覆盖404(未找到)。您不能在404上使用Location:
标头重定向(它只适用于3xx),并且只能发送一个状态。JQuery(正确地)只会在错误状态下触发错误回调;这些都是4xx。
维基百科对此的解释非常好。
检查Chrome Developer Tools、Firebug或开发代理中的标头将显示此处发生的情况:通过PHP发送"Location:"标头设置的302 Found标头将覆盖原本会发送的404错误。因此,没有客户端(包括搜索引擎,在本例中还有jQuery的AJAX请求处理程序)知道发生了错误。就他们而言,请求是成功的,并获得了预期的内容(在一次重定向后)。
在没有重定向的情况下发送更简单的404将导致更可预测的行为。