web-dev-qa-db-ja.com

If-Modified-SinceHTTPヘッダーを理解する

リクエストオブジェクトのIf-Modified-Sinceヘッダーを使用しようとしているキャッシングライブラリを探しています。問題は、このヘッダーが設定されないことです。常に空白であるため、REQUESTであることがわかります。

リクエストにIf-Modified-Sinceヘッダーを強制するにはどうすればよいですか?それとも私はこれが何をするのかわからないのですか?.

これが私が参照している関数です。

public function isNotModified(Request $request)
{
    $lastModified = $request->headers->get('If-Modified-Since');

    $notModified = false;
    if ($etags = $request->getEtags()) {
        $notModified = (in_array($this->getEtag(), $etags) || in_array('*', $etags)) && (!$lastModified || $this->headers->get('Last-Modified') == $lastModified);
    } elseif ($lastModified) {
        $notModified = $lastModified == $this->headers->get('Last-Modified');
    }

    if ($notModified) {
        $this->setNotModified();
    }

    return $notModified;
}
14
Mike

If-Modified-Since を含む要求は、 Last-Modified ヘッダーを組み合わせた応答とともに取得されたリソースがクライアントにすでにある場合にのみ意味があります。 Cache-Control および/または Pragmapublicを含む値のようなブラウザキャッシュを可能にするヘッダー付き。

また、元の応答に ETag ヘッダーも含まれている場合、一部のブラウザーにはIf-Modified-Sinceが含まれていないことに気付きました。ブラウザは代わりに If-None-Match を使用してテストします。

参照:

24
BalusC

まず、最初の応答が最初にキャッシュされていることを確認する必要があります(I answered これは別の関連する質問です。

次のフィールドを設定してみてください。

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
  • バリデーターとしてLast-Modifiedが必要です(If-Modified-Sinceをテストする場合は、ETagを送信しないでください)
  • Expires -1は、リソースが古く、常に再検証する必要があることを示しています
  • Cache-Controlにはキャッシュもストアも含めないでください

最初のHTTP/200応答でこれらのヘッダーを送信すると、後続のリクエストで、ブラウザはIf-Modified-Sinceヘッダーを含む条件付きリクエストを送信する必要があります。

11
alienhard