为动态生成的svgz图像设置expires标头

时间:2015-04-09 13:30:51

标签: php .htaccess caching dynamic svg

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

2 个答案:

答案 0 :(得分:0)

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

  1. 为您的PHP代码添加到期设置,就像您已经添加了其他标头一样。除非你制作一些特殊的逻辑,否则在apache中跳过相同标题的设置 - 否则你的PHP标题将被覆盖。
  2. 将反向代理放在apache之前,为你做这件事。 (或者做一些令人讨厌的事情,你有相同的apache实例反向代理自己)
  3. 设置每个目录的到期时间(仅存在svg生成脚本):
  4. <Directory /var/www/html/svg>
    ExpiresDefault "access plus 60 seconds"
    </Directory>
    

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

答案 1 :(得分:0)

在帖子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文件中添加上面的片段允许设置缓存我的文件的持续时间,该文件使用随机变量给用户一些惊喜。但是,以上内容可以防止过于频繁的更新(5分钟)并限制http请求。

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

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

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