我是否必须再次使用304 Not Modified标头发送ETag?

时间:2013-04-02 19:57:18

标签: php http http-status-code-304 http-etag

我正在玩PHP,使用ETags,IF_NONE_MATCH等,当发生奇怪的事情时。我编写了下面的代码,它检查IF_NONE_MATCH。如果它匹配我的ETag,我发送一个304响应头。如果没有,我发送其他标题告诉浏览器缓存页面,我的ETag与它们一起。 我期待得到一次页面,然后一直得到304。相反,我得到一次页面,然后是304,然后是页面,然后是304,等等。 当我检查Chrome的标题视图时,我看到如果我没有在304代码中再次设置ETag,则在下次获取页面时它不会将其发送回请求标头中。 这是正常行为还是只是Chrome?我做错了吗?

以下是代码:

<?php
    $etag = '89453fo245tyu5o423ty5349gu0p34';

    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
                                  $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
         header('', true, 304);
    } else {
         header('Expires: Fri, 06 Apr 2013 23:59:59 03:00 GMT');
         header('Pragma: cache');
         header('Cache-Control: public, must-revalidate, max-age=0');
         header('ETag: ' . $etag);
         echo 'new page';
    }

1 个答案:

答案 0 :(得分:1)

我认为问题出在你的标题调用中。使用正确的标题调用as mention in this answer,一切都应该没问题:

header('HTTP/1.1 304 Not Modified');

还要记住,如果按F5刷新页面,可能浏览器会忽略缓存并直接进入网络服务器。要测试,我会添加指向同一页面的链接,或者只需单击浏览器地址栏并按Enter键。