2

我有以下 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 未修改),但是当它发生变化时,我需要他们的浏览器下载并缓存新版本(200 OK)。

4

1 回答 1

1

仅当客户端在请求中304 Not Modified包含标头时才应发送标头。If-Modified-Since

我有一个 PHP 脚本,它总是生成相同的一致输出(它恰好是图像/png),具体取决于重写规则提供给它的选项。对于我的脚本,我假设 ANYIf-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 中工作的更多信息,请查看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 检测到的静态文件上的文件系统时间戳不再可用。

于 2012-12-07T21:28:16.133 回答