質問

私の質問は、どの回答は、HTTP304"変更されません"を受けた場合は、 if-none-matchが一致した場合-変性-年からプロキシ/クライアントからのリクエスト.

からのRFC2616secttion14.26( http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26 ):

しない場合にはエンティティの場合、このタグに一致し サーバが実行要求された の方法の場合はIf-None-Matchが一致しヘッダー 分野には存在しなかったなければなりません をすべて無視する場合は更新-からヘッダー 分野はます。である場合 個別タグの試合では、そのサーバー なを返しではなく304(not Modified) に応じます。

私には理解この声明...

  1. "のどれも当てはまらない場合、主体のタグに一致"PHPいもの $_SERVER['HTTP_IF_NONE_MATCH'] 対私ETagsうに送付しょうか。
  2. 理解していくことで解決するとのETags場 $_SERVER['HTTP_IF_NONE_MATCH'] 合っETags、停止すべての検証とそのページが正常です。

誰でもどこでも、RFCに擬似コード(またはPHPのコード)及び/又は回答(2ポイントしますのでご注意ください。▼

編集1: まセントWolandお答えになります。ができます(だいについて知っておきましょ正しいこれらの6ポイント:

  1. の形式 $_SERVER['HTTP_IF_NONE_MATCH'] のいずれかです:

    a)If-None-Matchが一致し:"xyzzy","r2d2xxxx","c3piozzzz"

    b)If-None-Matchが一致し:"xyzzy"

    な:

    c)If-None-Matchが一致し:"xyzzy,r2d2xxxx,c3piozzzz"

  2. の場合 !array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER),anyTagMatched()はNULLを返します。

  3. としていETagに $_SERVER['HTTP_IF_NONE_MATCH'] 試合のマイドキュメントETag,anyTagMatched()はTRUEを返します。

  4. のどれも当てはまらない場合、Etagsに $_SERVER['HTTP_IF_NONE_MATCH'] ているマッチングマイドキュメントETag, anyTagMatched() FALSEを返します。

  5. の場合 $_SERVER['HTTP_IF_MODIFIED_SINCE'] 設定やマッチマイドキュメント"最終更新日 isExpired() FALSEを返す場合、TRUEを返します。

  6. どの anyTagMatched() TRUEを返すと、私の発行304.まanyTagMatched()返されるNULL isExpired() 返されたときはFALSEを発行できるこ304.その他の状況で私は私のページを通常の(ままの課題を最新の最終更新やETagヘッダ).

役に立ちましたか?

解決

こする必要がありますの末に移動しよう).

$anyTagMatched = anyTagMatched() ;
if( $anyTagMatched || ( ( null === $anyTagMatched ) && !isExpired() ) ) {
    notModified() ;
}
// Output content

擬似コード(審査に必要な):

<?php

/**
 * Calculates eTag for the current resource.
 */
function calculateTag() {
}

/**
 * Gets date of the most recent change.
 */
function lastChanged() {
}

/**
 * TRUE if any tag matched
 * FALSE if none matched
 * NULL if header is not specified
 */
function anyTagMatched() {
    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ?
        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
        false ;

    if( false !== $if_none_match ) {
        $tags = split( ", ", $if_none_match ) ;
        $myTag = calculateTag() ;
        foreach( $tags as $tag ) {
            if( $tag == $myTag ) return true ;
        }
        return false ;
    }
    return null ;
}

function isExpired() {
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ?
        stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) :
        false;

    if( false !== $if_modified_since ) {
        // Compare time here; pseudocode.
        return ( $if_modified_since < lastChanged() ) ;
    }

    return true ;
}

function notModified() {
    header('HTTP/1.0 304 Not Modified');
    exit ;
}

主な回答 こちらの.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top