【问题标题】:Set expires header for dynamically generated svgz image为动态生成的 svgz 图像设置过期标头
【发布时间】:2015-06-14 21:41:01
【问题描述】:

我用php动态生成svgz图片,例如:

<?php
    header("Content-Encoding: gzip");
    header("Content-Type: image/svg+xml");
    $wth=1280;$hth=180;
    $hd="<svg width='".$wth."' height='".$hth."' viewBox='0 0 ".$wth." ".$hth."' xmlns='http://www.w3.org/2000/svg' version='1.1'>";
    $hd.="<rect x='0' y='0' width='".$wth."' height='".$hth."' fill='green'/>";
    $rad=25;$ncr=20;$rcv=['yellow','gray','red'];
    for($c=0;$c<$ncr;$c++){$hd.="<circle cx='".mt_rand($rad,$wth-$rad)."' cy='".mt_rand($rad,$hth-$rad)."' r='".$rad."' fill='".$rcv[mt_rand(0,count($rcv)-1)]."'/>";}
    $hd.="</svg>";
    echo gzencode($hd,9);
?>

在我的 htaccess 文件中添加:

ExpiresActive on
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/svg+xml "access plus 60 seconds"
ExpiresDefault "access plus 0 seconds"

但它没有按预期工作,并且 php-svg 图像文件始终显示 200 OK 状态 我也简单地尝试过:

ExpiresActive on
ExpiresByType image/png "access plus 1 month"
ExpiresDefault "access plus 60 seconds"

(这不适合我的需要,因为我希望所有其他 html/xml 文件为 0 秒) 而且这样 php-svg 图像也不会被缓存,并且会出现 200 OK

请注意,其他作为 html 的 php 文件也不会被缓存 (???)

在这两种情况下,png 文件都按预期缓存并提供 304 状态

我也尝试添加一个

ini.set('session.cache_limiter','public')
ini.set('session.cache_expire',60)

直接在php-svg文件中没有结果

请注意,在我的 php.ini 文件中,设置是

session.cache_limiter = nocache
session.cache_expire = 180

怎么了? 是否存在与某些 php.ini 配置相关的问题? htaccess 是否覆盖 php.ini ? 有没有不需要修改php ini的解决方案?

非常欢迎任何帮助!

乔凡尼 (我的网站:http://isbooth.com

【问题讨论】:

    标签: php .htaccess caching dynamic svg


    【解决方案1】:

    我不相信 Apache 会“猜测”任何 PHP 脚本将产生的内容类型。所以你有几个选择:

    1. 将过期设置添加到您的 PHP 代码中,就像您已经添加了其他标头一样。跳过 apache 中相同标头的设置,除非您制定了一些特殊逻辑 -​​ 否则您的 PHP 标头将被覆盖。
    2. 将反向代理放在 apache 前面,它会为你做这件事。 (或者做一些奇怪的事情,你有相同的 apache 实例反向代理到自己)
    3. 为每个目录设置过期时间(只有生成 svg 的脚本位于那里):
    ExpiresDefault "访问加 60 秒" 目录>

    之前有人问过类似的问题: Setup HTTP expires headers using PHP and Apache

    【讨论】:

    • 我更喜欢您的选项 1,但我无法实现...您能解释一下原因吗?似乎 htaccess mod exp 覆盖了 php 文件中设置的标头
    • @GiovanniDrago 是的-您不能混合来自 php 和 apache 的过期标头。您使用的 Apache 机制是一种“钝器” - 它不关心会发生什么 - 它只可以设置|追加|合并|添加|取消设置|回显|编辑标题:link,Expires* 指令也是如此- 他们不关心预先存在的标题并将覆盖。
    【解决方案2】:

    受到php eTag generation using php 帖子的启发,我终于找到了在我的特定情况下缓存 svgz 图像的解决方案,但必须手动设置 Etag 并发送 304 标头:

    $duration=300;
    $etag=md5(__FILE__.round(time()/$duration));
    $ifNoneMatch=(isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);
    header("Etag: ".$etag);
    if ($ifNoneMatch == $etag){header("HTTP/1.1 304 Not Modified");}
    

    在我的 svg-php 文件中添加上面的 sn-p 可以设置缓存我的文件的持续时间,它使用随机变量给用户一些惊喜。但是,上述方法可以防止过于频繁的更新(5 分钟)并限制 http 请求。

    欢迎所有更优雅的解决方案:我想避免将上面的代码添加到我所有的 php-svg 文件中

    请注意,所有在 php 中简单地添加缓存控制标头的试验在 Safari 和 Firefox 中都失败了,例如:

    header("Cache-Control: max-age=900");
    header("Expires: ".gmdate("D, d M Y H:i:s",time()+900)." GMT");
    header("Last-Modified: ".gmdate("D, d M Y H:i:s",time()-36000)." GMT");
    

    非常感谢, 乔瓦尼 (网址:http://isbooth.com

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 2014-03-27
      • 2017-03-19
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多