【问题标题】:PHP not obeying my defined ETagsPHP 不遵守我定义的 ETags
【发布时间】:2010-05-11 00:22:59
【问题描述】:

我在做什么

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

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

问题

$_SERVER['HTTP_IF_NONE_MATCH'] 对我不可用。据我所知,这是因为 PHP 的“不服从缓存控制”的生活方式。我不能乱用会话缓存限制器,因为我没有访问权限。但是,即使我确实有访问权限,我也不想碰它:99% 的网站都在 WordPress 下。

环境

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

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

干杯。

【问题讨论】:

    标签: php apache wordpress caching


    【解决方案1】:

    您是否尝试过从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[...] 变量。

    【讨论】:

      【解决方案2】:

      如果 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]
      

      【讨论】:

        猜你喜欢
        • 2011-02-13
        • 2015-05-30
        • 1970-01-01
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        相关资源
        最近更新 更多