使用.htaccess,我将PHP处理程序设置为我的所有.css和js,以便输出基于用户代理的代码:
AddHandler application/x-httpd-php .css .js
例如:
<?PHP if ($CurrentBrowser == 'msie') { ?>
.bind('selectstart', function(event) { ... })
<?PHP } ?>
因此,事实上,我的代码文件是动态创建的,但可以被视为静态文件。这是因为,一旦他们第一次编译,浏览器可以从缓存中恢复它们并重复使用它们直到我更改它们的内容。 这就是我使用指纹识别/版本控制和长时间过期的原因:
[INDEX.PHP]
<script type="application/javascript" src="<?PHP echo GetVersionedFile('/script.js'); ?>"></script>
<script type="application/javascript" src="/script.1316108341.js"></script>
[.HTACCESS]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule "^(.+)\.(\d+)\.(css|js)$" $1.$3 [L]
问题是这些文件,即使我用适当的标头发送它们,也不会被任何浏览器缓存(我从来没有得到304代码,总是200)。这是我服务器响应的日志:
[CHROME]
Request URL:http://127.0.0.1:8888/script.1316108341.js
Request Method:GET
Status Code:200 OK
-----
Cache-Control:max-age=31536000, public
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:6150
Content-Type:application/javascript
Date:Thu, 15 Sep 2011 21:41:25 GMT
Expires:Fri, 14 Sep 2012 21:41:25 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.17 (Win32) PHP/5.3.6
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.6
[MOZILLA]
Request URL:http://127.0.0.1:8888/script.1316108341.js
Request Method:GET
Status Code:200 OK
-----
Date Thu, 15 Sep 2011 21:43:26 GMT
Server Apache/2.2.17 (Win32) PHP/5.3.6
X-Powered-By PHP/5.3.6
Content-Encoding gzip
Vary Accept-Encoding
Cache-Control max-age=31536000, public
Expires Fri, 14 Sep 2012 21:43:26 GMT
Content-Type application/javascript
Content-Length 6335
Keep-Alive timeout=5, max=100
Connection Keep-Alive
-----
Last Modified Thu Sep 15 2011 23:43:26 GMT+0200 (= time i loaded the page) (???)
Last Fetched Thu Sep 15 2011 23:43:26 GMT+0200 (= time i loaded the page) (???)
Expires Fri Sep 14 2012 23:43:26 GMT+0200
Data Size 6335
Fetch Count 10
Device disk
可能是什么问题?如何强制缓存这些文件? 很多,非常感谢!
答案 0 :(得分:5)
由于PHP正在处理PHP和CSS文件的请求,因此每次都会执行带有条件的PHP代码。
Apache / PHP不知道内容是否可以缓存,或者是否应该重新生成,因此每次都会执行PHP代码。
如果您发送最后修改的标题,或使用版本控制/指纹识别方法,则您的PHP脚本负责检查指纹或版本并确定它是否仍然有效。如果是这样,那么您可以发送304 Not Modified标头并终止任何进一步处理。您还可以检查Last-Modified标记的请求标头并使用该方法。
另一种方法是将各种浏览器和日期的响应缓存到文件中,这样您就可以为第一次用户提供该文件,而不是使用php重新生成它。然后,您可以检查该文件的修改时间,以确定是否可以发送304标题。
这个SitePoint article解释了使用PHP缓存的几种方法。希望有所帮助。