php - 我是否必须再次发送带有 304 Not Modified header 的 ETag?

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

我正在玩 PHP,使用 ETags、IF_NONE_MATCH 等,这时发生了一件奇怪的事情。我写了下面的代码,它检查 IF_NONE_MATCH。如果它与我的 ETag 匹配,我将发送一个 304 响应 header 。如果没有,我会发送其他 header 告诉浏览器缓存该页面,以及我的 ETag。 我期望获得该页面一次,然后一直获得 304。相反,我获取页面一次,然后是 304,然后是页面,然后是 304,等等。 当我检查 Chrome 的 header View 时,我发现如果我没有在 304 代码中再次设置 ETag,它不会在我下次获取该页面时将其发回请求 header 中。 这是正常行为还是只是 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';
    }

最佳答案

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

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

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

关于php - 我是否必须再次发送带有 304 Not Modified header 的 ETag?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15773214/

相关文章:

angularjs - 对远程 Sails 服务器的 Angular JS 请求

http - 使用 mime/multipart 上传会损坏文件

go - 从 DB golang 查询后收到 304 代码

php - Laravel dynamic where 使用 Query Builder 进行查询

php - 在 PHP 中构造装饰器

javascript - 在php中登录后不显示模态框

caching - 使用 maxage header 时不可能出现 304 响应

php - 根据天数 (28,29,30,31) 找出特定日期过去了多少个月

java - HTTP 406 的 Spring 返回 JSON(NOT_ACCEPTABLE)

linux - 页面上的某些图像未通过 Varnish Cache-304 未修改