12

PHPで動的コンテンツを生成しています。

次の HTTP ヘッダーを送信しています。

HTTP/1.1 304 Not Modified
Date: Sun, 09 Dec 2012 17:24:41 GMT
Server: Apache
Connection: keep-alive, Keep-Alive
Keep-Alive: timeout=1, max=100
Etag: "237f43b800e655dbe6567f7d32d34c99"
Expires: Sun, 16 Dec 2012 17:24:41 GMT
Cache-Control: max-age=604800
Vary: Accept-Encoding

後で、Etag がheader('HTTP/1.1 304 Not Modified')一致するかどうかを確認して送信します。これは、Chrome と Firefox で完全に機能します。ただし、Safari (バージョン 6.0.2) は「If-Modified-Since」および「If-None-Match」ヘッダーを送信しません。これは、2 番目のページ ヒットで Safari から送信された Request-Header です。

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Cache-Control: max-age=0

そのページにリンクされている他のすべてのファイルは適切な Request-Headers を受け取り、Safari はキャッシュされたファイルまたは 304 を適切に使用します。

Safari に正しい Request-Header を送信しないのはなぜですか? 何を変更できますか?

ありがとうございました!

4

2 に答える 2

3

If-Modified-Since

If-Modified-Sinceのメモは、Last-Modified応答ヘッダーの内容とは異なるものを使用しないように警告しています。

注: クライアントが、同じリクエストの Last-Modified ヘッダーから取得した日付ではなく、If-Modified-Since ヘッダーで任意の日付を使用する場合、クライアントは、この日付がサーバーの理解で解釈されるという事実に注意する必要があります。時間の。

あなたの応答にはLast-Modifiedが含まれていませんが、含まれていたとしても、ユーザーエージェントが If-Modified-Since を送信しなければならない、または送信すべきであるとは仕様に記載されていません。

一致しない場合

Safari がIf-None-Match を送信しない理由については、私を打ち負かします。あなたのETagは有効に見えます。

一般的なキャッシングの実施

繰り返しになりますが、一般に、仕様にはキャッシュしなければならないということは何もありません。キャッシュするときは、 Cache-Control に従わなければならないということだけです。したがって、これは少し非対称な関係です。(透過的な) キャッシュを強制してオリジン サーバーを再チェックすることはできますが、オリジン サーバーとして、ユーザー エージェントにキャッシュを強制することはできません。

私はそれについて何ができますか?

Safari は一部が無料のソフトウェアです。Last-Modified を追加しても問題が解決しない場合は、それほど多くはありません。

于 2014-04-24T15:43:34.663 に答える
1

さまざまな大きなサイトから送信されたヘッダーを探して、これを解決することになりました。

Last-Modified: {some date}
Cache-Control: max-age=0, must-revalidate
Expires: -1

これは私にとってSafariで機能しています。

于 2016-04-20T08:05:44.997 に答える