【问题标题】:Caching problem using "AddHandler application/x-httpd-php"使用“AddHandler application/x-httpd-php”缓存问题
【发布时间】:2011-11-18 06:19:48
【问题描述】:

使用 .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

可能是什么问题?如何强制缓存这些文件? 非常非常感谢!

【问题讨论】:

  • +1 以获得出色的描述和清晰的问题呈现!

标签: php apache .htaccess caching http-headers


【解决方案1】:

由于 PHP 和 CSS 文件的请求由 PHP 处理,因此您的 PHP 代码及其条件每次都会被执行。

Apache/PHP 不知道内容是否可缓存或是否应该重新生成以便每次都执行您的 PHP 代码。

如果您发送最后修改的标头,或使用您的版本控制/指纹方法,那么您有责任在 PHP 脚本中检查指纹或版本并确定它是否仍然有效。如果是这样,那么您可以发送 304 Not Modified 标头并终止任何进一步的处理。您还可以检查 Last-Modified 标记的请求标头并使用该方法。

另一种方法是将各种浏览器的响应和日期缓存到一个文件中,这样您就可以为初次使用的用户提供该文件,而不是使用 php.ini 重新生成它。然后你可以检查那个文件的修改时间来确定你是否可以发送一个304头。

SitePoint article 解释了几种使用 PHP 进行缓存的方法。希望对您有所帮助。

【讨论】:

  • 另见this answer
  • 嗯...我不明白第一种方法。如果我不知道浏览器是否在缓存中,如何发送 304?
  • 通过使用文件名中的时间戳,您是否有办法知道该时间戳是否仍然有效?如果是这样,您可以执行类似 if(thisTimestampIsValid(1316108341)) { header('HTTP/1.1 304 Not Modified');出口; } 否则你可能需要更复杂的逻辑。我在评论中链接的答案显示了使用浏览器 Last-Modified 和 If-Modified-Since 标头执行您在 doConditionalGet() 函数中尝试执行的操作的好方法。否则,您可能需要做的是将单个输出缓存到文件并使用 md5 或其他东西来了解 css/js 是否仍然有效。
猜你喜欢
  • 2012-10-08
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多