带有查询字符串的 HTTP 缓存 URL
HTTP Caching URLs with 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);
不幸的是,这些 'images' 没有被缓存,这导致页面加载时出现非常不希望的延迟时间。 所以我的问题是:如何使用查询字符串从 url 中缓存?(首选 .htaccess 解决方案。)
旁注:
我知道这一点 post。但是,标出的答案不是我的解决方案。
编辑:我不是简单地问如何启用缓存。我已经知道该怎么做了。我网站的某些部分缓存得很好。我正在寻找 专门从带有查询字符串的网址缓存。
如果我理解正确的话,如果没有一些我什至无法想到并且无论如何都会反对的可怕黑客,你想做的事情是不可能的。
我认为缓存的工作方式是在键值存储系统中,其中键是 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.
}
}
建议我将 headers 放入我的 php 文件 (php_nub_qq recommended a function & SuperJer recommended header('Expires: ' . gmdate('D, d M Y H:i:s', strtotime('+1 hours')) . ' GMT');)。
我相当确定将 headers 放入此文件对我没有任何作用,而且 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 的网络开发工具后,我意识到 SuperJer 最初怀疑我的浏览器设置是正确的。我的文件一直在缓存,我刚刚在我的开发者工具中检查了 "Disable Cache"。 (我想我比我想象的更累,因为我发誓我检查过了。)
总结:如果您的查询字符串不是动态的并且其他内容(例如图像)缓存在您的网站上;闭上眼睛,放松地深呼吸,检查你所有的浏览器设置,不要忘记你的开发工具设置。
我目前将 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);
不幸的是,这些 'images' 没有被缓存,这导致页面加载时出现非常不希望的延迟时间。 所以我的问题是:如何使用查询字符串从 url 中缓存?(首选 .htaccess 解决方案。)
旁注: 我知道这一点 post。但是,标出的答案不是我的解决方案。
编辑:我不是简单地问如何启用缓存。我已经知道该怎么做了。我网站的某些部分缓存得很好。我正在寻找 专门从带有查询字符串的网址缓存。
如果我理解正确的话,如果没有一些我什至无法想到并且无论如何都会反对的可怕黑客,你想做的事情是不可能的。
我认为缓存的工作方式是在键值存储系统中,其中键是 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.
}
}
建议我将 headers 放入我的 php 文件 (php_nub_qq recommended a function & SuperJer recommended header('Expires: ' . gmdate('D, d M Y H:i:s', strtotime('+1 hours')) . ' GMT');)。
我相当确定将 headers 放入此文件对我没有任何作用,而且 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 的网络开发工具后,我意识到 SuperJer 最初怀疑我的浏览器设置是正确的。我的文件一直在缓存,我刚刚在我的开发者工具中检查了 "Disable Cache"。 (我想我比我想象的更累,因为我发誓我检查过了。)
总结:如果您的查询字符串不是动态的并且其他内容(例如图像)缓存在您的网站上;闭上眼睛,放松地深呼吸,检查你所有的浏览器设置,不要忘记你的开发工具设置。