0

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秒以内にページをリロードするとエラーが常に発生しますが、リンクをクリックするとサファリで機能する場合と機能しない場合があります

4

1 に答える 1

2

/test.phpは常に設定されますこれらのヘッダーを明示的に設定しているためheader("Cache-Control: no-store, no-cache, must-revalidate");、ヘッダーについて興味深いことは何もありません。do not cache

/test.php?img=上記のようにCache-Controlヘッダーを設定することは決してなく、常に空白の304NotModifiedを返します。header()呼び出しの直後に終了します。技術的には、アパッチするイメージではありません。mimeタイプはtext/htmlになるため、expires / cacheingをhtmlおよびphp(.confおよび/またはhtaccess内)として保持します。header('Content-Type: image/jpeg', true);あなたがそうするか、または同様でない限り。

状況によっては、header()の2番目のパラメーターを使用して、以前のパラメーターを置き換えることもできます。

代わりにこれを試してください。同じ結果が得られたら教えてください

<?php
if (isset($_GET['img'])) {
    header('Content-Type: image/jpeg', true);
    header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified', true, 304);
    exit;
} else {
    header('Expires: -1', true);
    header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0', true);
}
?>
于 2012-07-26T20:38:21.313 に答える