首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为动态生成的svgz镜像设置过期标头

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

Stack Overflow用户
提问于 2015-04-09 21:30:51
回答 1查看 1.3K关注 0票数 0

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

代码语言:javascript
复制
<?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文件中,我添加了:

代码语言:javascript
复制
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状态,我也简单地尝试了一下:

代码语言:javascript
复制
ExpiresActive on
ExpiresByType image/png "access plus 1 month"
ExpiresDefault "access plus 60 seconds"

(这并不适合我的需要,因为我希望所有其他html/xml文件都是0秒),但这样也不会缓存php-svg图像,结果是200OK

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

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

我还尝试添加了一个

代码语言:javascript
复制
ini.set('session.cache_limiter','public')
ini.set('session.cache_expire',60)

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

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

代码语言:javascript
复制
session.cache_limiter = nocache
session.cache_expire = 180

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

任何帮助都非常欢迎!

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

EN

回答 1

Stack Overflow用户

发布于 2015-04-10 17:52:10

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

代码语言:javascript
复制
$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中都失败了,例如:

代码语言:javascript
复制
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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29539932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档