【发布时间】:2011-05-12 08:13:50
【问题描述】:
问题
我正在做一些实验,需要一些帮助。
我创建了 2 个文件。 main-real.css 是一个标准的普通 ol' css 文件,而 main.css 是由 PHP 解析并有一个 include() 抓取以前的真正 css文件。
以下是 main.css 的代码:
<?php
include("main-real.css");
?>
然后我在我的 .htaccess 文件中添加一条指令,以使用 PHP 解析这个 css 文件:
<FilesMatch "main.css">
AddHandler application/x-httpd-php5 .css
Header Set Content-Type "text/css"
</FilesMatch>
这在我运行 Apache 的 PHP 5.2 服务器上完美运行。
问题是该文件似乎没有被浏览器缓存,或者至少没有像常规的未经 PHP 解析的 CSS 文件那样返回 304 Not Modified 状态代码。
如果直接访问,以下是 main-real.css 的标头:
响应头 日期.......周四,2010 年 11 月 18 日 22:10:57 GMT 服务器............Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 最后修改.....周四,2010 年 11 月 18 日 22:10:23 GMT Etag.......“11b010a-26-4955b0e6671c0” 接受范围.....字节 内容长度....38 内容类型......文本/css 请求标头 接受......文本/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 接受语言....en-us,en;q=0.5 接受编码....gzip,deflate 接受字符集.....ISO-8859-1,utf-8;q=0.7,*;q=0.7 保活…………115 连接............保持活动状态 饼干......fc=fcVal=7625790752294348480 If-Modified-Since..Thu, 2010 年 11 月 18 日 22:10:23 GMT 如果-无匹配......“11b010a-26-4955b0e6671c0” 缓存控制......max-age=0这里是 PHP 解析的 main.css 的标头:
响应头 日期......周四,2010 年 11 月 18 日 22:11:11 GMT 服务器............Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 X-Powered-By.......PHP/5.2.11 内容类型.......文本/css Keep-Alive.........超时=5,最大值=97 连接............保持活动 传输编码..chunked 请求标头 接受......文本/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 接受语言....en-us,en;q=0.5 接受编码....gzip,deflate 接受字符集.....ISO-8859-1,utf-8;q=0.7,*;q=0.7 保活…………115 连接............保持活动状态 饼干......fc=fcVal=7625790752294348480 缓存控制......max-age=0我尝试过以各种方式修改 http-headers,添加 max-age、last-modified 和其他都没有成功。我有什么遗漏或误解吗?
解决方案和最终代码
主要缺少的代码是我需要在 include() 之前发送 Last-Modified 标头。这需要在 PHP 文件本身中完成!我之前尝试过使用 .htaccess Header set 指令添加 Last-Modified,虽然这确实添加了适当的标头,但它并没有触发缓存。
这是我的 main.css 的最终代码,带有遥远的未来 Expires 标头和 Cache-Control 以进行良好的衡量。
<?php
$last_modified = date("D, d M Y H:i:s \G\M\T", filemtime("main-shared.css"));
$expiration = date("D, d M Y H:i:s \G\M\T", strtotime('+1 year'));
header("Cache-Control: public, no-transform");
header("Expires: $expiration");
header("Last-Modified: $last_modified");
include("main-shared.css");
?>
【问题讨论】:
标签: php parsing caching .htaccess http-headers