これを再現できますが、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でテストしています