PHP不遵守我定义的ETag

时间:2010-05-11 00:22:59

标签: php apache wordpress caching

我在做什么

我从数据库中提取图像并使用所有正确的标题将其发送到浏览器 - 图像显示正常。我还发送了一个ETag标题,使用图像内容的SHA1作为标记。

图像被定期调用半部分,因此缓存有点问题(不会杀死网站,但很高兴)。

问题

$ _ SERVER ['HTTP_IF_NONE_MATCH']无法使用。据我所知,这是因为PHP的“违反缓存控制”的生活方式。我不能搞乱会话缓存限制器,因为我没有访问权限。但是,即使我确实有访问权限,我也不想触摸它:99%的网站都在WordPress下。

环境

  • PHP 4(不要问)
  • Apache 2.2
  • WordPress的
  • 图像存在于数据库(largeblog)中,我无法更改。

任何指导,提示/技巧等都会有所帮助。我没有太多空间来改变环境/结构的东西。

干杯。

2 个答案:

答案 0 :(得分:2)

您是否尝试过从apache_request_headers()读取HTTP_IF_NONE_MATCH?

如果你运行的是4.3之前的php,那之前就叫做getallheaders()。


修改 我现在看到,在我链接的页面中,您可能还想尝试放置

RewriteEngine on
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]

在相应的.htaccess文件中强制Apache设置您尝试阅读失败的PHP $ _SERVER [...]变量。

答案 1 :(得分:0)

如果PHP没有收到If-None-Match匹配标头,那么你无能为力。我不知道你的意思是“PHP”不服从缓存控件“”; PHP在运行中生成任意动态,它不能先验地知道客户端是否缓存了返回的内容。

无论如何,您应该调查客户端是否实际上正在发送标头。如果是,但它没有到达PHP,请检查它是否到达Apache。如果它到达PHP而不是Apache,你总是可以通过mod-rewrite破解一些解决方案,比如将标题添加为查询字符串(未测试!):

RewriteCond %{HTTP_IF_NONE_MATCH} (.+)
RewriteRule ^/get_image.php /get_image.php?if-none-match=%1 [B,QSA]