缓存页面资产

时间:2012-02-10 12:35:17

标签: php javascript css .htaccess user-interface

为了减少对UI资产(JS / CSS)的HTTP请求,我编写了一个PHP脚本来组合这些文件并将其提供为:“assets / basic,login,jquery-ui-10.css”和这工作正常,但我决定把它放得更远,并要求浏览器通过在PHP脚本中添加一个过期标头来缓存这些Assets Combiner(我称之为)。当然这里我正在利用htacess RewriteRule功能来引用这个脚本assets.php?files = basic,login,jquery-ui& type = css& version = 10到上面的那个使它看起来像一个CSS文件浏览器缓存它(这样看起来很好:))。我还使用“version”参数强制浏览器更新文件,但这不会发生!,我已经添加了这些头信息来缓存文件:

    header("HTTP/1.1 304 Not Modified");
    header("Expires: Sat, 1 Jun 2015 12:00:00 GMT");
    header("Cache-Control: must-revalidate");

然而,当我尝试更改上面的URL字符串中的版本参数时,虽然文件名已更改,但它不会下载新文件内容>对于浏览器

我在这里做错了什么,如何强制浏览器重新下载新文件>它具有不同的名称(但仍然发送上述标题)

提前致谢

2 个答案:

答案 0 :(得分:1)

你做不到。 “未修改”的重点在于它告诉浏览器文档与上一版本相同,不应下载。

AFAIK,您只应发送它以回复If-Modified-Since请求。

答案 1 :(得分:1)

正如Quentin所说,你必须只发送一个304响应以响应IF-Modified-Since OR if-None_match请求。通过发送304响应,您告诉浏览器使用缓存副本,即使它没有

实际上,使用304响应实际上可能会破坏提高性能的目的,并且通常更好地忽略条件请求并使用内容和新缓存指令进行200响应

如果您希望缓存内容,则发送max-age和Expires标头(只有HTTP / 1.0客户端才需要过期标头 - 所有现代浏览器都实现HTTP1 / 1 - 即使您明确告诉他们使用HTTP / 1.0)。

e.g。

header("Expires: Sat, 1 Jun 2015 12:00:00 GMT");
header("Cache-Control: max-age=94608000,must-revalidate");