0

さて、.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 ドキュメント ステータスが失われます。

何を提案しますか?

4

2 に答える 2

0

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_headersApache/mod_php を使用している場合も参照してください。

編集:

これを行う必要がある理由は、以下に示すように、header("Location: /#error");が 302 (リダイレクト) ヘッダーを送信し、404 (見つかりません) をオーバーライドするためです。ヘッダーを使用Location:して 404 にリダイレクトすることはできず (3xx でのみ機能します)、送信できるステータスは 1 つだけです。JQuery は (正しく) エラー ステータスでのみエラー コールバックをトリガーします。これらはすべて 4xx です。

これに関するウィキペディアの説明は非常に優れています。

于 2011-05-30T02:58:22.310 に答える
0

Chrome 開発者ツール、Firebug、または開発プロキシでヘッダーを確認すると、ここで何が起こっているかがわかります。PHP によって "Location:" ヘッダーを送信することによって設定された 302 Found ヘッダーは、そうでなければ送信される 404 エラーを上書きします。その結果、クライアント (この場合は検索エンジンと jQuery の AJAX 要求ハンドラーを含む) は、エラーが発生したことを知りません。彼らに関する限り、リクエストは成功し、意図したコンテンツを取得しました (1 回のリダイレクトの後)。

リダイレクトなしでより単純な 404 を送信すると、より予測可能な動作が得られます。

于 2011-05-29T23:29:52.820 に答える