我用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图像文件总是显示200OK状态,我也简单地尝试了一下:
ExpiresActive on
ExpiresByType image/png "access plus 1 month"
ExpiresDefault "access plus 60 seconds"(这并不适合我的需要,因为我希望所有其他html/xml文件都是0秒),但这样也不会缓存php-svg图像,结果是200OK
请注意,用作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 )
发布于 2015-04-10 17:52:10
受post 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文件中。
请注意,所有简单地在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)
https://stackoverflow.com/questions/29539932
复制相似问题