我有以下PHP文件:
<?php
Header('Content-Type: application/javascript');
echo "// Some dynamically generated JavaScript here...";
所以它是一个.php文件,但它被解释为一个JavaScript文件。我会把它加载到这样的网页中:
<script type='text/javascript' src='myjavascript.php'></script>
我的问题是关于访问此文件时发送的HTTP代码。每当我请求此文件时(直接或通过请求它的网页),Chrome开发工具都会显示状态为200 OK。它永远不会是304,即使内容没有改变。
在内容未更改的情况下,是否可以为动态生成的文件获取304 Not Modified?如果没有,为什么?
我还使用了一些允许使用以下路由的PHP框架:/js/myjavascript.js
。所以我可以将上面的代码放在该路由中,以相同的方式动态生成JavaScript。但同样,每次仍然是200,即使内容没有改变,URI也是.js文件。
有解决方案吗?在我的情况下,这个javascript / php文件的内容每天更改一次。所以我需要我的访问者浏览器大部分时间缓存文件(304 Not Modified)但是当它确实发生变化时,我需要他们的浏览器下载并缓存新版本(200 OK)。
答案 0 :(得分:1)
如果客户端在请求中包含304 Not Modified
标头,则只应发送If-Modified-Since
标头。
我有一个PHP脚本,它始终生成相同的一致输出(恰好是image / png),具体取决于重写规则为其提供的选项。对于我的脚本,我假设任何If-Modified-Since
反映了浏览器中的有效缓存数据,因此我的脚本包括:
// 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中使用浏览器缓存的更多智慧,请查看this comment on PHP: header
。
您可以使用命令行中的cURL
来测试此行为:
[ghoti@pc ~]$ curl -sL -w "%{http_code} %{url_effective}\\n" https://www.google.com/images/srpr/logo3w.png -o /dev/null
200 https://www.google.com/images/srpr/logo3w.png
[ghoti@pc ~]$ curl -H"If-Modified-Since: Sat, 31 Dec 2011 00:00:00 GMT" -sL -w "%{http_code} %{url_effective}\\n" https://www.google.com/images/srpr/logo3w.png -o /dev/null
200 https://www.google.com/images/srpr/logo3w.png
[ghoti@pc ~]$ curl -H"If-Modified-Since: Mon, 31 Dec 2012 00:00:00 GMT" -sL -w "%{http_code} %{url_effective}\\n" https://www.google.com/images/srpr/logo3w.png -o /dev/null
304 https://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
毫无疑问,Server:
可以被忽略,但如果您包含其他三个,则Chrome可能会减少投诉。但是,正如我所说,您将不得不提出您想要用来确定动态生成内容的“年龄”的标准,因为Apache检测到的静态文件上的文件系统时间戳不再可用。