为动态生成的svgz映像设置过期标头


Set expires header for dynamically generated svgz image

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

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

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

类似的问题以前也被问过:使用PHP和Apache 设置HTTP过期标头

受使用php生成php后eTag的影响,我终于找到了一个在特定情况下缓存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)