17

304 応答を送信するとき。ブラウザは、304 と一緒に送信する他のヘッダーをどのように解釈しますか?

例えば

header("HTTP/1.1 304 Not Modified");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT");

$offset 時間が「なくなる」まで、ブラウザーが別の条件付き GET 要求 (または要求) を送信しないようにしますか?

また、他のヘッダーはどうですか?

このようなヘッダーを 304 と一緒に送信する必要があります。

header('Content-Type: text/html');

送信する必要がありますか:

header("Last-Modified:" . $modified);
header('Etag: ' . $etag);

次回 $offset が「使い果たされた」ときにブラウザが条件付き GET リクエストを送信するようにするには、古い Last Modified 値と Etag 値を単に保存しますか?

304 応答ヘッダーを送信する際に注意すべき点は他にありますか?

4

2 に答える 2

13

このブログ投稿は、「条件付き取得」の獣を飼いならすために私を大いに助けました。

興味深い抜粋(ベンの答えと部分的に矛盾する)は次のように述べています。

通常の応答にETagヘッダーが含まれている場合、そのヘッダーも304応答に含まれている必要があります。

キャッシュヘッダー(Expires、Cache-Control、および/またはVary)(値が前の応答で送信された値と異なる可能性がある場合)。

これは、 RFC2616秒10.3.5に完全に準拠しています。


200リクエスト未満...

HTTP/1.1 200 OK
Server: nginx/0.8.52
Date: Thu, 18 Nov 2010 16:04:38 GMT
Content-Type: image/png
Last-Modified: Thu, 15 Oct 2009 02:04:11 GMT
Expires: Thu, 31 Dec 2010 02:04:11 GMT
Cache-Control: max-age=315360000
Accept-Ranges: bytes
Content-Length: 6394
Via: 1.1 proxyIR.my.corporate.proxy.name:8080 (IronPort-WSA/6.3.3-015)
Connection: keep-alive
Proxy-Connection: keep-alive
X-Junk: xxxxxxxxxxxxxxxx

...そしてその最適な有効な304の対応物。

HTTP/1.1 304 Not Modified
Server: nginx/0.8.52
Date: Thu, 18 Nov 2010 16:10:35 GMT
Expires: Thu, 31 Dec 2011 16:10:35 GMT
Cache-Control: max-age=315360000
Via: 1.1 proxyIR.my.corporate.proxy.name:8080 (IronPort-WSA/6.3.3-015)
Connection: keep-alive
Proxy-Connection: keep-alive
X-Junk: xxxxxxxxxxx

ExpiresヘッダーはせいぜいRFC-261614.21に準拠Current Date + One Yearしていることに注意してください。

于 2010-11-19T15:23:13.380 に答える