【问题标题】:Setting an ErrorDocument 404 in .htaccess causes jQuery's AJAX call to never error在 .htaccess 中设置 ErrorDocument 404 会导致 jQuery 的 AJAX 调用永远不会出错
【发布时间】:2011-05-29 21:17:49
【问题描述】:

好的,所以我尝试使用 .htaccess 为各种错误代码设置 ErrorDocuments。它工作得很好,除了现在,以下 jQuery AJAX 代码将永远不会运行 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文档状态。

你有什么建议?

【问题讨论】:

    标签: php ajax .htaccess http-status-code-404 errordocument


    【解决方案1】:

    尝试将标头与您的 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(未找到)。您不能使用 Location: 标头在 404 上重定向(它仅适用于 3xx)并且您只能发送一个状态。 JQuery 将(正确地)仅在错误状态下触发错误回调;这些都是 4xx。

    Wikipedia对此的解释非常好。

    【讨论】:

    • 我改变了标题("Location: /#error"); to header("位置:/?error#error");然后在 index.php 的开头添加一个 if() 语句,如果 $_GET["error"] isset() 会添加一个 404 标头。
    【解决方案2】:

    检查 Chrome 开发者工具、Firebug 或开发代理中的标头将显示此处发生的情况:通过 PHP 发送“Location:”标头设置的 302 Found 标头会覆盖原本会发送的 404 错误。结果,没有客户端(包括搜索引擎和本例中的 jQuery 的 AJAX 请求处理程序)知道发生了错误。就他们而言,请求成功并获得了预期的内容(在一次重定向之后)。

    发送不带重定向的更简单的 404 将导致更可预测的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2012-08-26
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多