Ale*_*exV 8 php caching http http-1.1
我的问题是关于怎么回复一个HTTP 304"未修改"当我收到这两个如果,没有匹配,并从代理/客户端请求,如果-,因为修改.
来自RFC 2616第14.26节(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26):
如果没有任何实体标签匹配,则服务器可以执行所请求的方法,就像If-None-Match头字段不存在一样,但是也必须忽略请求中的任何If-Modified-Since头字段.也就是说,如果没有实体标签匹配,那么服务器绝不能返回304(未修改)响应.
我不太明白这个说法......
$_SERVER['HTTP_IF_NONE_MATCH']说我之前发送的ETag吗?$_SERVER['HTTP_IF_NONE_MATCH']匹配我的ETag,我就会停止所有验证并正常提供页面.任何人都可以用伪代码(或PHP代码)翻译这个RFC部分和/或回答我的2分以上?
编辑1: 谢谢St.Woland的回答.你(或其他任何人)可以告诉我这些6点是否正确:
格式$_SERVER['HTTP_IF_NONE_MATCH']可以是:
a)If-None-Match:"xyzzy","r2d2xxxx","c3piozzzz"
b)如果 - 无匹配:"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()返回NULL并isExpired()返回FALSE我可以发出304.在任何其他情况下,我正常服务我的页面(我也发布最新的Last-Modified和ETag标题).
这应该放在最后(移动以获得更好的外观).
$anyTagMatched = anyTagMatched() ;
if( $anyTagMatched || ( ( null === $anyTagMatched ) && !isExpired() ) ) {
notModified() ;
}
// Output content
Run Code Online (Sandbox Code Playgroud)
伪代码(需要审核):
<?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 ;
}
Run Code Online (Sandbox Code Playgroud)
主要答案在这里.
| 归档时间: |
|
| 查看次数: |
9930 次 |
| 最近记录: |