15

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;
}
4

2 に答える 2

25

のリクエストは、やを含む値などのブラウザ キャッシングを許可するヘッダーと組み合わせIf-Modified-Sinceたヘッダーを持つレスポンスとともに取得されるリソースをクライアントがすでに持っている場合にのみ意味があります。Last-ModifiedCache-ControlPragmapublic

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

以下も参照してください。

于 2011-02-22T17:21:26.873 に答える
11

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

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

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

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

于 2011-02-22T22:05:06.900 に答える