Webサーバーのルートに次のように保存された次の単純なphpページで本当に奇妙な問題が発生しましたtest.php
:
<?
if( $_GET['img'] ) {
header('HTTP/1.0 304 Not Modified');
die();
} else {
header("Cache-Control: no-store, no-cache, must-revalidate");
}
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<body>
<img src="/test.php?img=1">
<a href="/not_existent_page.php">Dead link</a>
</body>
</html>
したがって、ページが読み込まれると、サーバーは次のヘッダーで応答します。
Status Code 200
Cache-Control no-store, no-cache, must-revalidate
Content-Type text/html; charset=utf-8
Date Wed, 18 Jul 2012 12:00:43 GMT
Server Apache/2.2.22 (Ubuntu)
Strict-Transport-Security max-age=172800, includeSubDomains
Vary Accept-Encoding
x-frame-options sameorigin
x-powered-by PHP/5.4.4-1~precise+1
x-ua-compatible IE=edge
興味深い部分はキャッシュヘッダーです:それは、キャッシュしないでくださいと言います!
ページを読み込んだ後の画像のリクエストには、次の応答ヘッダーがあります。
Status Code 304
Date Wed, 18 Jul 2012 12:02:20 GMT
Server Apache/2.2.22 (Ubuntu)
キャッシングについては何も述べていません(しかし、それはとにかく問題ではありません、私はそれをテストしました)。
FirefoxとChromeを使用すると、サイトは本来の動作をします。ページをリロードするたびに、本来のようにリロードされます。リンクをクリックすると、404apacheエラーが発生します。
サファリでは、次のことが起こります。
最初にページを開くと、それが表示されます。短時間でページをリロードすると(以下の「短時間」の意味を参照)、常に空白のサイトが表示されます。クリックしてデッドリンクをクリックすると、空白のサイトが表示されることがありますが、次のヘッダーが表示されます。サファリのWeb開発者コンソール:
Status Code 304
Connection:Keep-Alive
Date:Wed, 18 Jul 2012 12:07:41 GMT
Keep-Alive:timeout=15, max=99
Server:Apache/2.2.22 (Ubuntu)
Vary:Accept-Encoding
ページは空白のままです!しかし:私のApacheサーバーのログでは、ページのリロード時にステータスコード200ですべて正常に返されたと書かれています。
// first page load
[18/Jul/2012:14:10:12 +0200] "GET /test.php HTTP/1.1" 200 979 "url/test.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"
// request of picture with answer 304
[18/Jul/2012:14:10:12 +0200] "GET /test.php?img=1 HTTP/1.1" 304 266 "url/test.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"
// reload within 10 seconds
[18/Jul/2012:14:10:19 +0200] "GET /test.php HTTP/1.1" 200 777 "url/test.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"
(そしてデッドリンクをクリックすると404。)
そして今、興味深い部分が来ます:私が約待つ場合。ページを読み込んでから10秒以上経過すると、Safariは期待どおりに動作します。304ヘッダーなしでリロード時にページを再度読み込むだけです(またはデッドリンクに404が表示されます)。
FirefoxとChromeはまったく問題ありません。
だから私の質問:サファリはページのヘッダーを混同していますが、それはページを再度ロードするとき/ 10秒以内にリンクをクリックするときだけですか?どうすればこれを防ぐことができますか?これはサファリのバグですか?
ところで:ヘッダーを別のものに変更すると、Safariはそのヘッダーをキャッシュします。したがって、test.phpを次のように変更すると、次のようになります。
...
if( $_GET['img'] ) {
header('HTTP/1.0 204 No Content');
die();
} else {
....
ページのリロードは何もせずに単に中止されるようになりましたが、サファリコンソールに表示されるヘッダーは204 No Content
です。
最後にもう1つ、10秒以内にページをリロードするとエラーが常に発生しますが、リンクをクリックするとサファリで機能する場合と機能しない場合があります。