4

ajaxリクエストかどうかに応じて、キャッシュ可能なコンテンツを提供しようとしています。

シナリオ:

小さなPHPスクリプト"/test.php"は、いくつかのHTML出力を提供し、次のヘッダーを設定します。

Expires         Wed, 23 Feb 2011 13:30:06 GMT
Cache-Control   public, max-age=60
Vary            X-Requested-With,Accept-Encoding

出力は$_SERVER['HTTP_X_REQUESTED_WITH']状態によって異なります。

FirefoxがURLを指すと、出力が表示され、次の1分間は、サーバーにアクセスせずに、ブラウザキャッシュから同じ結果が表示されます。OK、これまでのところ。

XMLHttpRequest(ヘッダー付き)を介して同じリソースを要求するとX-Requested-With: XMLHttpRequest、Firefoxはサーバーを要求しませんが、キャッシュからの(間違った)応答を提供します!

逆に言えば、同じです。リソースに対するAjax-Callがキャッシュをいっぱいにし、後続のBrowser-Requestがキャッシュからの(間違った)応答を提供します。

誰かがこのトピックの経験がありますか?これは十分に一般的な問題であると思います-ajaxかどうかに応じて(同じURLで)コンテンツを提供します。

あいさつ、Ilja

4

1 に答える 1

1

これを再現できますが、ajax 応答に X-Requested-With ヘッダーを含めない場合に限ります。ajax呼び出しのヘッダーを設定すると、ほとんど期待どおりに機能しますが、ajax呼び出しは通常のリクエストのキャッシュをクリアし、その逆も同様です-コンテンツはキャッシュされませんが、間違ったコンテンツを取得することはありません.

私のPHPドキュメントは次のようになります。

<?
    putenv('TZ=PST8PDT');
    date_default_timezone_set('America/Los_Angeles');

    header('Expires: '.gmdate("D, d M Y H:i:s").' GMT');
    header('Cache-Control: public, max-age=60');
    header('Vary: X-Requested-With,Accept-Encoding');

    echo 'it is now '.date('Y-m-d H:i:s');
?>

そして、私のテストページは次のようになります:

<a href="resource.php" target="ifr">load into frame</a><br />
<iframe name="ifr" width="400" height="100"></iframe>

<hr />

<a href="#" onclick="return load();">load into div via ajax</a><br />
<div id="di" style="border: 1px solid black; width: 400px; height: 100px;"></div>

<script>

function load(){

    var req = new XMLHttpRequest();
    req.onreadystatechange = function(){

        if (req.readyState == 4){
            document.getElementById('di').textContent = req.responseText;
        }
    }

    req.open('GET', 'resource.php', 1);
    req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    req.send(null);

    return false;
}

</script>

最初のリンクにアクセスすると、サーバーから要求されます。もう一度ヒットすると、キャッシュから来ます。以降のすべてのクリックは、最大 60 秒までキャッシュから取得されます。

2 番目のリンクをクリックすると、リクエストがサーバーに送信されます。もう一度ヒットすると、キャッシュから来ます。以降のすべてのクリックは、最大 60 秒までキャッシュから取得されます。

リンク 1 をヒットしてからリンク 2 をヒットすると、両方ともサーバーに移動します。その後、リンク 1 をもう一度クリックすると、サーバーに再度アクセスします (これは間違っています)。デモ シーケンス (すべて 60 秒以内と仮定):

Reg  : server
Reg  : cache
Reg  : cache
Reg  : cache
Ajax : server
Ajax : cache
Reg  : server
Ajax : server

つまり、ajax 経由で提供されたときに別の方法で確実にキャッシュしたい場合は、ajax リクエストを行うときに別の URL を使用します (?ajax=1 は正常に機能します)。

最新のFF 4.0でテストしています

于 2011-04-16T19:22:21.997 に答える