我使用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)
答案 0 :(得分:0)
我不相信Apache会猜测&#34;猜测&#34;任何PHP脚本将产生的内容类型。所以你有几个选择:
<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)