带有查询字符串的HTTP缓存URL

时间:2015-06-25 20:37:36

标签: php .htaccess caching svg query-string

我目前将svg代码存储在一个php文件的数组中,简而言之,我正在引用整个站点来检索所需的图像。

该文件如下所示:

<?php
$svg_ticons = array(...);
$svg_icons = array(...);
$svg_inputs = array(
    'checkbox_0' => '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0" y="0" viewBox="0 0 60 60" enable-background="new 0 0 60 60" xml:space="preserve"><symbol id="Checkbox_Blank" viewBox="-7.5 -7.5 15 15"><path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M-4.81 6.97h9.63c1.19 0 2.16-0.97 2.16-2.16v-9.63c0-1.19-0.97-2.16-2.16-2.16H-4.81c-1.19 0-2.16 0.97-2.16 2.16v9.63C-6.98 6-6 6.97-4.81 6.97L-4.81 6.97z"/><path fill="#333333" d="M4.82-7.5h-9.63c-1.48 0-2.68 1.21-2.68 2.69v9.63c0 1.48 1.2 2.69 2.68 2.69h9.63c1.48 0 2.68-1.21 2.68-2.69V-4.81C7.5-6.29 6.3-7.5 4.82-7.5zM-4.82 6.45c-0.9 0-1.64-0.73-1.64-1.64V-4.81c0-0.9 0.74-1.64 1.64-1.64h9.63c0.9 0 1.64 0.73 1.64 1.64v9.63c0 0.9-0.74 1.64-1.64 1.64H-4.82z"/></symbol><use xlink:href="#Checkbox_Blank" width="15" height="15" x="-7.5" y="-7.5" transform="matrix(4 0 0 -4 29.9997253 29.9989338)" overflow="visible"/></svg>'
);

$svgall = $svg_ticons+$svg_icons+$svg_inputs;
if(array_pop((explode("/", $_SERVER['SCRIPT_FILENAME']))) == array_pop((explode("/", __FILE__)))){
    if($reqsvg = $_GET["r"]?:false){header("Content-type: image/svg+xml"); echo $svgall[$reqsvg]; exit();}
}
?>

所以,当我打电话给这些图像时,让我们说,作为背景图像,它看起来像这样:

background-image:url(DOMAIN/images/svg.php?r=checkbox_0);

不幸的是,这些&#39;图像&#39;没有被缓存,这导致页面加载时非常不希望的延迟时间。 所以我的问题是:如何使用查询字符串从网址缓存? (。首选.htaccess解决方案。)

旁注: 我知道这个post。但是,标记的答案不是我的解决方案。

编辑 :我不是简单地询问如何启用缓存。我已经知道如何做到这一点。我网站的部分内容都很漂亮。我希望使用查询字符串专门从网址缓存。

2 个答案:

答案 0 :(得分:1)

如果我理解正确的话,你想做什么是不可能的,如果没有一些我甚至无法想到的可怕的黑客攻击,反正会提出建议。

我相信,缓存的工作方式是在键值存储系统中,其中键是URI +查询字符串。因此,浏览器将使用某个密钥保存您的图像,当使用相同密钥请求图像时,如果浏览器符合过期标准,浏览器将使用缓存版本,或者发送请求以查看文件是否已被修改。

在您的情况下,查询字符串的r=checkbox_0部分似乎是动态的,这意味着每次刷新页面时它都会更改它的值。由于我上面提到的原因,您无法缓存此内容。如果您每次都获得不同的查询字符串,浏览器最终将每次都缓存一个单独的图像。

IMO,您可以做的最好是为r参数使用静态值,如果可能的话。

此外,如果无论查询字符串如何都可以缓存图像,那么如何缓存破坏工作:P

修改

这是缓存功能,它需要你的缓存在到期之前激活的时间,以秒为单位。

function cache($sec) {
    if ($sec > 0) {
        header('Cache-Control: must-revalidate, max-age=' . (int)$sec);
        header('Pragma: cache');
        header('Expires: ' . str_replace('+0000', 'GMT', gmdate('r', time() + $sec)));
    } else {
        header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
        header('Pragma: no-cache'); // HTTP 1.0.
        header('Expires: 0'); // Proxies.
    }
}

答案 1 :(得分:0)

建议我在我的php文件中添加标题(php_nub_qq建议function&amp; SuperJer推荐header('Expires: ' . gmdate('D, d M Y H:i:s', strtotime('+1 hours')) . ' GMT');)。

我很确定在这个文件中放置标题对我来说没什么用。 SuperJer的代码破坏了我的图像,但是第二天早上用新鲜的头脑弄乱了它后我终于明白了原因。

这是我输入的代码:

header("Expires: ".gmdate("%D, %d %M %Y %H:%i:%s", strtotime("+30 days"))."GMT");

但是,我忘了为了在我的网站中致电strtotime,我必须先设置date_default_timezone_set();

所以最终的结果是:

date_default_timezone_set("America/Los_Angeles");
header("Expires: ".gmdate("%D, %d %M %Y %H:%i:%s", strtotime("+30 days"))."GMT");

然而 ,在进一步检查Chrome的网络开发者工具后,我意识到SuperJerinitial suspicion是我的浏览器设置正确。我的文件一直在缓存,我只是在我的开发人员工具中检查了“禁用缓存”。 (猜猜我比我想的要累得多,因为我可以发誓我检查过了。)

摘要:如果您的查询字符串不是动态的&amp;您网站上的其他内容(如图片)缓存;闭上眼睛,长时间放松一下,放松一下。检查所有浏览器设置&amp; 忘记开发工具设置。