繁体   English   中英

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

[英]How to get 304 response for PHP generated javascript file?

我有以下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未修改”? 如果没有,为什么?

我还使用了一些/js/myjavascript.js ,它们允许诸如/js/myjavascript.js路由。 因此,我可以将上述代码放入该路由中,以相同的方式动态生成JavaScript。 但是同样,每次仍然是200,即使内容没有更改并且URI是一个.js文件。

有解决方案吗? 以我的情况,此javascript / php文件的内容每天大约更改一次。 因此,我需要访问者的浏览器大部分时间来缓存文件(304未修改),但是当文件确实发生更改时,我需要他们的浏览器下载并缓存新版本(200 OK)。

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

我有一个PHP脚本,该脚本始终生成相同的一致输出(恰好是image / png),具体取决于重写规则将哪些选项提供给它。 对于我的脚本,我假设ANY 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脚本在每次运行时都会动态生成内容。

有关如何在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检测到的静态文件的文件系统时间戳不再可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM