簡體   English   中英

帶有查詢字符串的HTTP緩存URL

[英]HTTP Caching URLs with Query String

我目前正在一個php文件中將svg代碼存儲在數組中,簡而言之,我正在引用整個站點來檢索所需的圖像。

該文件看起來像這樣:

<?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);

不幸的是,這些“圖像”沒有被緩存,這在頁面加載時導致非常不希望的延遲時間。 所以我的問題是: 如何從帶有查詢字符串的網址緩存? (.htaccess解決方案是首選。)

旁注:我知道這篇文章 但是,標記的答案不是我的解決方案。

編輯 :我不是簡單地問如何啟用緩存。 我已經知道如何做到這一點。 我網站的部分內容都很漂亮。 我期待從具有查詢字符串的URL專門緩存。

你想做什么,如果我理解正確的話,如果沒有一些我甚至無法想到的糟糕的黑客行為是不可能的,並且無論如何都會提出建議。

我相信,緩存的工作方式是在鍵值存儲系統中,其中鍵是URI +查詢字符串。 因此,瀏覽器將使用特定密鑰保存您的圖像,當使用相同密鑰請求圖像時,如果瀏覽器符合過期標准,瀏覽器將使用緩存版本,或者發送請求以查看文件是否已被修改。

在您的情況下,查詢字符串的r=checkbox_0部分似乎是動態的,這意味着每次刷新頁面時它都會更改它的值。 由於我上面提到的原因,您無法緩存此內容。 如果每次都獲得不同的查詢字符串,瀏覽器最終每次都會緩存一個單獨的圖像。

你可以做的最好的事情就是為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.
    }
}

建議我把標題放在我的php文件中( php_nub_qq推薦一個函數SuperJer推薦標題('Expires:'。gmdate('D,d MYH: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的網絡開發者工具后,我意識到SuperJer 最初懷疑它是我的瀏覽器設置是正確的。 我的文件一直在緩存,我只是在我的開發人員工具中檢查了“禁用緩存”。 (猜猜我比我想象的更疲憊,因為我可以發誓我檢查過了。)

摘要 :如果您的查詢字符串不是動態的,那么您網站上的其他內容(如圖像)就會緩存; 閉上眼睛,來一次長時間悠閑的氣息,並檢查所有瀏覽器設置: 不要忘記你的開發工具設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM