2008-10-15 34 views

回答

0

你可以正确使用http响应头,但它经常被忽略。

否则存储内容的本地MD5哈希可能对你有用的(除非有,你可以勾了一个更简单的内容中的字符串)。这并不理想(因为这是一个相当缓慢的过程),但它是一种选择。

0

是的,您可以并应该使用HTTP标头将页面标记为未过期。如果它们是动态的(PHP,ASPX等)和/或数据库驱动,则需要手动控制设置Expires标头/发送HTTP Not Modified。 ASP.NET有一些SqlDependency对象,但它们仍需要配置和管理。 (不知道PHP有东西只是喜欢它,但可能有一些在PEAR如果不...)

1

这是ETag头的确切目的,但它必须由你的web框架或支持您需要注意您的应用程序正确响应带有标题的请求如果 - 匹配,如果不匹配如果 - 范围(请参阅HTTP Ch 3.11)。

0

Last-Modified头只会对你有用的,如果该网站的程序员已明确将其归还。

对于常规的,静态Last-Modified页面的HTML文件的最后修改的时间戳。对于动态生成的页面,服务器无法可靠地分配Last-Modified值,因为它根本不知道如何根据请求更改内容,所以很多服务器根本不会生成标题。

如果你有在页面控件,然后确保最后修改头被设置将确保Last-Modified检查是成功的。否则,您可能需要获取页面,并执行正则表达式来查找更改后的部分(例如新闻网站标题中的日期/时间)。如果没有这样明显的标记存在,那么我会在页面内容上第二个Oli's suggestion作为一种确定它已经改变的方式。

2

即使你可能会认为这是过时的我总是发现西蒙·威利森对Conditional GET文章比有用的多。这个例子是在PHP中,但它很简单,你可以适应其他语言。这是例子:

function doConditionalGet($timestamp) { 
    // A PHP implementation of conditional get, see 
    // http://fishbowl.pastiche.org/archives/001132.html 
    $last_modified = substr(date('r', $timestamp), 0, -5).'GMT'; 
    $etag = '"'.md5($last_modified).'"'; 

    // Send the headers 
    header("Last-Modified: $last_modified"); 
    header("ETag: $etag"); 

    // See if the client has provided the required headers 
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? 
     stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 
     false; 

    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? 
     stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
     false; 

    if (!$if_modified_since && !$if_none_match) { 
     return; 
    } 

    // At least one of the headers is there - check them 
    if ($if_none_match && $if_none_match != $etag) { 
     return; // etag is there but doesn't match 
    } 

    if ($if_modified_since && $if_modified_since != $last_modified) { 
     return; // if-modified-since is there but doesn't match 
    } 

    // Nothing has changed since their last request - serve a 304 and exit 
    header('HTTP/1.0 304 Not Modified'); 
    exit; 
} 

有了这个,你可以使用HTTP动词GETHEAD(我认为这也可能与others,但我看不到的原因使用它们)。您需要做的只是将If-Modified-SinceIf-None-Match与由页面的先前版本发送的标头Last-ModifiedETag的相应值相加。从HTTP 1.1版开始,建议使用ETag而不是Last-Modified,但两者都会完成这项工作。

这是条件GET如何工作的一个非常简单的例子。首先,我们需要检索的页面通常的方式:

GET /some-page.html HTTP/1.1 
Host: example.org

有条件的标题和内容首度回应:

200 OK 
ETag: YourETagHere

现在有条件的GET请求:

GET /some-page.html HTTP/1.1 
Host: example.org 
If-None-Match: YourETagHere

和表示响应您可以使用页面的缓存版本,因为只有标题即将交付:

304 Not Modified 
ETag: YourETagHere

通过此服务器通知您,页面没有修改。

我还可以推荐另一篇关于条件GET的文章:HTTP conditional GET for RSS hackers

相关问题