Установка ErrorDocument 404 в .htaccess приводит к тому, что AJAX-вызов jQuery никогда не вызывает ошибок - PullRequest
0 голосов
/ 30 мая 2011

Хорошо, поэтому я попытался использовать .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.

Что бы вы предложили?

Ответы [ 2 ]

0 голосов
/ 30 мая 2011

Попробуйте передать заголовок вместе с вашим 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_request_headers, если вы используете Apache / mod_php.

EDIT:

Причина, по которой вам нужно это сделать, заключается в том, что, как указано ниже, header("Location: /#error"); отправляет заголовок 302 (перенаправление), который переопределяет 404 (не найден). Вы не можете использовать заголовок Location: для перенаправления на 404 (он работает только на 3xx), и вы можете отправить только один статус. JQuery будет (правильно) вызывать ответный вызов ошибки только в состоянии ошибки; это все 4хх.

Википедия объяснение этого очень хорошее.

0 голосов
/ 30 мая 2011

Проверка заголовков в Chrome Developer Tools, Firebug или прокси-сервере разработки покажет, что здесь происходит. Заголовок 302 Found устанавливается путем отправки заголовка «Location:» с помощью PHP, переопределяет ошибку 404, которая в противном случае была бы отправлена. В результате ни один клиент (включая поисковые системы, а также обработчик запросов AJAX в jQuery в этом случае) не знает, что произошла ошибка. Насколько они обеспокоены, запрос был успешным и взял намеченное содержание (после одного перенаправления).

Отправка более простого 404 без перенаправления приведет к более предсказуемому поведению.

...