1

当奇怪的事情发生时,我正在使用 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';
    }
4

1 回答 1

1

我认为问题出在您的标头调用中。使用正确的标题调用,如this answer中所述,一切都应该没问题:

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

另请记住,如果您按 F5 刷新页面,您的浏览器可能会忽略缓存并直接访问网络服务器。为了测试,我会添加一个指向同一页面的链接,或者只需单击浏览器地址栏并按 Enter。

于 2013-04-02T21:23:28.910 回答