2011-02-22 15 views
0

私は以下の機能を持つキャッシングライブラリを使用しています。 5行目のリクエストからeTagsを取得しようとしていますが、eタグは決して設定されません。Etags HTTPヘッダーを理解します

いつREQUESTにeTagsがありますか?どのように設定するのですか?

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

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; 
} 
+0

[ETag](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19)応答ヘッダーフィールドのみの場合: "ETag応答ヘッダーフィールドは、要求されたバリアントのエンティティタグ " – Gumbo

+0

関連:http://stackoverflow.com/questions/5081397/understand-if-modified-since-http-headerそして、実際には、ETagは応答ヘッダーにのみ表示されます。あなたの他の質問に答えられたように、リクエストのcontra-headerは 'If-None-Match'です。 – BalusC

答えて

2

ETag header fieldのみ応答するためのものである:

のETagレスポンス・ヘッダー・フィールドは、要求されたバリアントのエンティティタグの現在の値を提供します。

しかしgetEtags方法はIf-None-Match header fieldからのタグのようになります。

エンティティタグのいずれかが同様のGETリクエストに応答して返されたであろうエンティティのエンティティタグが一致した場合"*"が指定されていて、そのリソースに現在のエンティティが存在する場合、要求された方法を実行してはならない(MUST NOT)修正日がで提供されたものと一致しないIf-Modi fied-Sinceヘッダーフィールド。代わりに、リクエストメソッドがGETまたはHEADの場合、サーバは一致したエンティティのうちの1つのキャッシュ関連ヘッダフィールド(特にETag)を含む304(Not Modified)レスポンスで応答する必要があります(SHOULD)。他のすべての要求方法については、サーバは状態412(前提条件失敗)で応答しなければならない(MUST)。

// the server MUST NOT perform the requested method 
$notModified = (
    // if any of the entity tags match the entity tag of the entity that 
    // would have been returned in the response to a similar GET request 
    // (without the If-None-Match header) on that resource 
    in_array($this->getEtag(), $etags) 
    // or if "*" is given and any current entity exists for that resource 
    || in_array('*', $etags)) 
    // unless required to do so because the resource's modification 
    // date fails to match that supplied in an If-Modified-Since header 
    // field in the request. 
    && (!$lastModified || $this->headers->get('Last-Modified') == $lastModified); 

最後の式(!$lastModified || $this->headers->get('Last-Modified') == $lastModified)が良い最後の文の一部をフィット!($lastModified && $this->headers->get('Last-Modified') != $lastModified)に相当します。

はこれが(私は、コードに合わせて最初の文を再配置)を正確に指定されたコードと一致しているようです。

+0

は、if_none_matchヘッダーをチェックしています。これは私が思ったよりずっと混乱しています。私はちょうどキャッシュしたい! – Mike

+0

@Mike:ありがとう、ありがとう。私の更新を参照してください。 – Gumbo

+0

@Mike:あなたが望むのは、ブラウザにリソースをキャッシュさせたいのであれば、リソースの**レスポンス**に 'ETag'、' Last-Modified'、 'Expires'ヘッダを追加するだけです。その後、 'If-Modified-Since'または' If-None-Match'で後続のリクエストが来たら、それらをテストし、304または問題の変更されたリソースを返すことによってそれに応じて処理します。 – BalusC

関連する問題