在.htaccess中设置ErrorDocument 404会导致jQuery';的AJAX调用永远不会出错


Setting an ErrorDocument 404 in .htaccess causes jQuery's AJAX call to never error

好吧,所以我尝试使用.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将导致更可预测的行为。