代码之家  ›  专栏  ›  技术社区  ›  Sam Bisbee

PHP不遵守我定义的etags

  •  3
  • Sam Bisbee  · 技术社区  · 14 年前

    我正在做什么

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

    图像被半定期地调用,因此缓存有点问题(不会杀死站点,但很好)。

    问题

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

    环境

    • php 4(不要问)
    • Apache 2.2
    • 文字出版社
    • 图片存在于数据库(largeblog)中,我无法更改。

    任何指导、提示/技巧等都是有用的。我没有太多空间来改变环境/结构方面的东西。

    干杯。

    2 回复  |  直到 14 年前
        1
  •  2
  •   MartinodF    14 年前

    如果没有匹配,您是否尝试读取http_? apache_request_headers() ?

    如果您运行的是4.3php之前的版本,它以前被称为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$_服务器[…]变量,但尝试读取失败。

        2
  •  0
  •   Artefacto    14 年前

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