HTTP if-none-matchが一致した場合-改変-降、304PHPの解明
質問
私の質問は、どの回答は、HTTP304"変更されません"を受けた場合は、 両 if-none-matchが一致した場合-変性-年からプロキシ/クライアントからのリクエスト.
からのRFC2616secttion14.26( http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26 ):
しない場合にはエンティティの場合、このタグに一致し サーバが実行要求された の方法の場合はIf-None-Matchが一致しヘッダー 分野には存在しなかったなければなりません をすべて無視する場合は更新-からヘッダー 分野はます。である場合 個別タグの試合では、そのサーバー なを返しではなく304(not Modified) に応じます。
私には理解この声明...
- "のどれも当てはまらない場合、主体のタグに一致"PHPいもの
$_SERVER['HTTP_IF_NONE_MATCH']
対私ETagsうに送付しょうか。 - 理解していくことで解決するとのETags場
$_SERVER['HTTP_IF_NONE_MATCH']
合っETags、停止すべての検証とそのページが正常です。
誰でもどこでも、RFCに擬似コード(またはPHPのコード)及び/又は回答(2ポイントしますのでご注意ください。▼
編集1: まセントWolandお答えになります。ができます(だいについて知っておきましょ正しいこれらの6ポイント:
の形式
$_SERVER['HTTP_IF_NONE_MATCH']
のいずれかです:a)If-None-Matchが一致し:"xyzzy","r2d2xxxx","c3piozzzz"
b)If-None-Matchが一致し:"xyzzy"
な:
c)If-None-Matchが一致し:"xyzzy,r2d2xxxx,c3piozzzz"
の場合
!array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)
,anyTagMatched()はNULLを返します。としていETagに
$_SERVER['HTTP_IF_NONE_MATCH']
試合のマイドキュメントETag,anyTagMatched()はTRUEを返します。のどれも当てはまらない場合、Etagsに
$_SERVER['HTTP_IF_NONE_MATCH']
ているマッチングマイドキュメントETag,anyTagMatched()
FALSEを返します。の場合
$_SERVER['HTTP_IF_MODIFIED_SINCE']
設定やマッチマイドキュメント"最終更新日isExpired()
FALSEを返す場合、TRUEを返します。どの
anyTagMatched()
TRUEを返すと、私の発行304.まanyTagMatched()返されるNULLisExpired()
返されたときは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 ;
}
主な回答 こちらの.