如何获得PHP生成的javascript文件的304响应?

如何获得PHP生成的javascript文件的304响应?,php,apache,browser,browser-cache,http-status-code-304,Php,Apache,Browser,Browser Cache,Http Status Code 304,我有以下PHP文件: <?php Header('Content-Type: application/javascript'); echo "// Some dynamically generated JavaScript here..."; 只有当客户机在请求中包含一个if Modified Since头时,才会发送304 Not Modified头 我有一个PHP脚本,它总是根据重写规则提供给它的选项生成相同的一致输出(它恰好是image/png)。对于我的脚本,我假设任何如果修

我有以下PHP文件:

<?php

Header('Content-Type: application/javascript');

echo "// Some dynamically generated JavaScript here...";

只有当客户机在请求中包含一个
if Modified Since
头时,才会发送
304 Not Modified

我有一个PHP脚本,它总是根据重写规则提供给它的选项生成相同的一致输出(它恰好是image/png)。对于我的脚本,我假设任何
如果修改,因为
会反映浏览器中的有效缓存数据,因此我的脚本包括:

// If they've got it, they should use it.
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strlen($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    header("HTTP/1.0 304 Not Modified");
    exit;
}
如果您想更聪明一些,可以解析变量并将其与脚本中重要的内容进行比较。您需要考虑如何在每次运行时动态生成内容的PHP脚本的上下文中检测内容是否已更改

有关如何在PHP中使用浏览器缓存的更多信息,请查看

您可以使用命令行中的
cURL
测试此行为:

[ghoti@pc~]$curl-sL-w“%{http\u code}%{url\u effective}\\n”https://www.google.com/images/srpr/logo3w.png -o/dev/null
200https://www.google.com/images/srpr/logo3w.png
[ghoti@pc~]$curl-H“如果修改自:2011年12月31日星期六00:00:00 GMT”-sL-w“{http_code}%{url_effective}\\n”https://www.google.com/images/srpr/logo3w.png -o/dev/null
200https://www.google.com/images/srpr/logo3w.png
[ghoti@pc~]$curl-H“如果修改自:2012年12月31日星期一00:00:00 GMT”-sL-w“%{http_code}%{url_effective}\\n”https://www.google.com/images/srpr/logo3w.png -o/dev/null
304https://www.google.com/images/srpr/logo3w.png
[ghoti@pc ~]$ 
注意不同的日期

如果你觉得Chrome发送的标题不够多,你可能会尝试复制其他流行网站提供的标题:

[ghoti@pc ~]$ curl -H"If-Modified-Since: Mon, 31 Dec 2012 00:00:00 GMT" -sLI https://www.google.com/images/srpr/logo3w.png
HTTP/1.1 304 Not Modified
Date: Wed, 05 Dec 2012 17:40:52 GMT
Expires: Thu, 13 Dec 2012 17:40:52 GMT
Age: 241012
Server: GFE/2.0

毫无疑问,
服务器:
可以忽略,但是如果你把其他三个都包括进来,你可能会少一些来自Chrome的抱怨。但是,正如我所说的,你必须拿出你想用的标准来确定你认为动态生成的内容的“年龄”,因为Apache检测到的静态文件上的文件系统时间戳不再可用。我以前在StackOverflow上看到过这个问题,在一般页面上。。。目前找不到它,但如果您通常从PHP中搜索创建适当的可缓存响应,您的运气可能会更好,他们可能有你要找的东西。很有趣。。。但如果我发送304头,然后退出(),Chrome开发工具会将状态显示为“已取消”,将“内容类型”显示为“待定”。文本是红色的,表示有错误或什么的。为什么这与其他非生成文件的普通304不同?此外,在服务器端,检测内容是否已实际更改也不是问题。在我的例子中非常简单。可能是Chrome希望在获得304时看到
Last Modified:
标题。我不需要在Firefox中这样做,所以我没有测试。我很懒,但你显然不懒让我们知道进展如何@Jakobud—我在这个答案中添加了最后一点,显示了来自已知良好站点的响应头。也许如果你模仿这些,你就不会出错。请务必让我们知道。
[ghoti@pc ~]$ curl -H"If-Modified-Since: Mon, 31 Dec 2012 00:00:00 GMT" -sLI https://www.google.com/images/srpr/logo3w.png
HTTP/1.1 304 Not Modified
Date: Wed, 05 Dec 2012 17:40:52 GMT
Expires: Thu, 13 Dec 2012 17:40:52 GMT
Age: 241012
Server: GFE/2.0