下列文檔詳細(xì)說(shuō)明了在具有已啟用緩存的路由規(guī)則時(shí) Front Door 的行為。 Front Door 是一種具有動(dòng)態(tài)站點(diǎn)加速和負(fù)載平衡功能的現(xiàn)代化內(nèi)容交付網(wǎng)絡(luò) (CDN),就像其他任何 CDN 一樣,也支持緩存行為。
Azure Front Door 服務(wù)可交付大型文件,不限制文件大小。 Front Door 使用一種被稱作對(duì)象區(qū)塊的技術(shù)。 請(qǐng)求大型文件時(shí),F(xiàn)ront Door 會(huì)從后端檢索文件的較小部分。 收到完整或字節(jié)范圍的文件請(qǐng)求后,F(xiàn)ront Door 環(huán)境以 8 MB 的區(qū)塊為單位從后端請(qǐng)求文件。
區(qū)塊到達(dá) Front Door 環(huán)境后,會(huì)將區(qū)塊緩存并立即提供給用戶。 然后,F(xiàn)ront Door 會(huì)并行預(yù)提取下一個(gè)區(qū)塊。 此預(yù)提取可確保內(nèi)容始終先于用戶一個(gè)區(qū)塊,從而減少延遲。 該過(guò)程將一直持續(xù)到下載完整個(gè)文件(如果需要)或客戶端關(guān)閉連接為止。
有關(guān)字節(jié)范圍請(qǐng)求的詳細(xì)信息,請(qǐng)閱讀 RFC 7233。 Front Door 會(huì)在收到任何區(qū)塊后將區(qū)塊緩存,因此整個(gè)文件無(wú)需在 Front Door 緩存中進(jìn)行緩存。 隨后從緩存中請(qǐng)求文件或字節(jié)范圍的請(qǐng)求。 如果區(qū)塊未全部緩存,將采用預(yù)提取從后端請(qǐng)求區(qū)塊。 這種優(yōu)化依賴于后端支持字節(jié)范圍請(qǐng)求的能力。 如果后端不支持字節(jié)范圍請(qǐng)求,則此優(yōu)化不會(huì)生效。
Front Door 可動(dòng)態(tài)壓縮邊緣內(nèi)容,從而更快響應(yīng)客戶端。 為了讓文件符合壓縮條件,必須啟用緩存,并且文件必須是 MIME 類型才能壓縮。 目前,F(xiàn)ront Door 不允許更改此列表。 當(dāng)前列表為:
"application/eot"
"application/font"
"application/font-sfnt"
"application/javascript"
"application/json"
"application/opentype"
"application/otf"
"application/pkcs7-mime"
"application/truetype"
"application/ttf",
"application/vnd.ms-fontobject"
"application/xhtml+xml"
"application/xml"
"application/xml+rss"
"application/x-font-opentype"
"application/x-font-truetype"
"application/x-font-ttf"
"application/x-httpd-cgi"
"application/x-mpegurl"
"application/x-opentype"
"application/x-otf"
"application/x-perl"
"application/x-ttf"
"application/x-javascript"
"font/eot"
"font/ttf"
"font/otf"
"font/opentype"
"image/svg+xml"
"text/css"
"text/csv"
"text/html"
"text/javascript"
"text/js", "text/plain"
"text/richtext"
"text/tab-separated-values"
"text/xml"
"text/x-script"
"text/x-component"
"text/x-java-source"
此外,文件大小必須介于 1 KB 與 8 MB 之間(不含首尾)。
這些配置文件支持以下壓縮編碼:
Gzip (GNU zip)
Brotli
如果請(qǐng)求同時(shí)支持 gzip 和 Brotli 壓縮,則 Brotli 壓縮優(yōu)先。
如果對(duì)資產(chǎn)的請(qǐng)求指定進(jìn)行壓縮,但該請(qǐng)求導(dǎo)致緩存缺失,則 Front Door 將直接在 POP 服務(wù)器上壓縮資產(chǎn)。 此后,將從緩存提供壓縮的文件。 通過(guò) transfer-encoding: chunked 返回所生成的項(xiàng)。
備注
范圍請(qǐng)求可以壓縮成不同的大小。 Azure Front Door 要求任何 GET HTTP 請(qǐng)求的 content-length 值都相同。 如果客戶端發(fā)送帶有 accept-encoding
標(biāo)頭的字節(jié)范圍請(qǐng)求導(dǎo)致源以不同的內(nèi)容長(zhǎng)度響應(yīng),則 Azure Front Door 將返回 503 錯(cuò)誤。 可以在源/Azure Front Door 上禁用壓縮,也可以創(chuàng)建規(guī)則集規(guī)則以從字節(jié)范圍請(qǐng)求中刪除 accept-encoding
。
借助 Front Door,可控制如何對(duì)包含查詢字符串的 Web 請(qǐng)求緩存文件。 在包含查詢字符串的 Web 請(qǐng)求中,查詢字符串是問(wèn)號(hào) (?) 后出現(xiàn)的請(qǐng)求部分。 查詢字符串可以包含一個(gè)或多個(gè)鍵值對(duì),其中字段名稱和其值由等號(hào) (=) 分隔。 每個(gè)鍵值對(duì)由與號(hào) (&) 分隔。 例如 http://www.contoso.com/content.mov?field1=value1&field2=value2
。 如果請(qǐng)求的查詢字符串中有多個(gè)鍵值對(duì),其順序并不重要。
忽略查詢字符串:在此模式下,F(xiàn)ront Door 將來(lái)自請(qǐng)求者的查詢字符串傳遞到第一個(gè)請(qǐng)求上的后端并緩存該資產(chǎn)。 由 Front Door 環(huán)境處理的資產(chǎn)的所有后續(xù)請(qǐng)求都將忽略查詢字符串,直到所緩存的資產(chǎn)過(guò)期。
緩存每個(gè)唯一的 URL:在此模式下,包含唯一 URL 的每個(gè)請(qǐng)求(包括查詢字符串)將視為具有其自己的緩存的唯一資產(chǎn)。 例如,后端對(duì) www.example.ashx?q=test1
的請(qǐng)求做出的響應(yīng)將緩存在 Front Door 環(huán)境中,并為具有同一查詢字符串的后續(xù)緩存返回該響應(yīng)。 www.example.ashx?q=test2
的請(qǐng)求將作為具有其自己的生存時(shí)間設(shè)置的單獨(dú)資產(chǎn)來(lái)緩存。
直到資產(chǎn)的生存時(shí)間 (TTL) 到期之前,F(xiàn)ront Door 將一直對(duì)資產(chǎn)進(jìn)行緩存。 每當(dāng)客戶端請(qǐng)求的資產(chǎn)的 TTL 已過(guò)期時(shí),F(xiàn)ront Door 環(huán)境會(huì)檢索新的更新后資產(chǎn)副本以提供請(qǐng)求,然后存儲(chǔ)已刷新的緩存。
確保用戶始終獲取資產(chǎn)的最新副本的最佳做法是針對(duì)每次更新將資產(chǎn)版本化,并將其發(fā)布為新 URL。 Front Door 將立即檢索用于下一個(gè)客戶端請(qǐng)求的新資產(chǎn)。 有時(shí)候可能希望從所有邊緣節(jié)點(diǎn)清除緩存的內(nèi)容,并強(qiáng)制其全部檢索新的已更新資產(chǎn)。 原因可能是 Web 應(yīng)用程序的更新,也可能是快速更新包含錯(cuò)誤信息的資產(chǎn)。
選擇要從邊緣節(jié)點(diǎn)清除的資產(chǎn)。 要清除所有資產(chǎn),請(qǐng)選擇“全部清除”。 否則,在“路徑”中,輸入要清除的每個(gè)資產(chǎn)的路徑。
要清除的路徑列表中支持以下格式:
單一路徑清除:通過(guò)指定資產(chǎn)的完整路徑(不帶協(xié)議和域)并包含文件擴(kuò)展名(例如 /pictures/strasbourg.png)來(lái)清除單個(gè)資產(chǎn);
通配符清除:星號(hào) (*) 可用作通配符。 清除路徑中帶有 /* 的終結(jié)點(diǎn)下的所有文件夾、子文件夾和文件,或者通過(guò)指定后跟 /* 的文件夾(例如 /pictures/*),清除特定文件夾下的所有子文件夾和文件。
根域清除:清除路徑中具有“/”的終結(jié)點(diǎn)的根。
備注
清除通配符域:按照本部分中所述指定用于清除的緩存路徑并不適用于與 Front Door 關(guān)聯(lián)的任何通配符域。 目前,我們不支持直接清除通配符域。 可以通過(guò)指定特定子域和清除路徑來(lái)清除特定子域中的路徑。 例如,如果我的 Front Door 有 *.contoso.com
,我可以輸入 foo.contoso.com/path/*
來(lái)清除子域 foo.contoso.com
的資產(chǎn)。 目前,要在清除內(nèi)容路徑中指定主機(jī)名,則僅限于通配符域的子域(如果適用)。
Front Door 的緩存清除不區(qū)分大小寫。 此外,它們不區(qū)分查詢字符串,這表示清除 URL 時(shí)將一并清除其查詢字符串的所有變體。
按下列標(biāo)題順序來(lái)確定項(xiàng)目在緩存中的存儲(chǔ)時(shí)間:
Cache-Control: s-maxage=<seconds>
Cache-Control: max-age=<seconds>
Expires: <http-date>
優(yōu)選可指示不緩存響應(yīng)的 Cache-Control 響應(yīng)標(biāo)頭,例如 Cache-Control: private,Cache-Control: no-cache 和 Cache-Control: no-store。 如果沒(méi)有 Cache-Control,則默認(rèn)行為是 Front Door 緩存資源的時(shí)間長(zhǎng)度為 X,其中 X 隨機(jī)選取時(shí)間為 1 到 3 天。
使用緩存時(shí),以下請(qǐng)求標(biāo)頭將不會(huì)被轉(zhuǎn)發(fā)到后端。
Content-Length
Transfer-Encoding
可以在 Front Door 設(shè)計(jì)器傳遞規(guī)則和規(guī)則引擎中配置緩存行為和持續(xù)時(shí)間。 規(guī)則引擎緩存配置將始終替代 Front Door 設(shè)計(jì)器傳遞規(guī)則配置。
禁用緩存后,無(wú)論源響應(yīng)指令是什么,F(xiàn)ront Door 都不會(huì)緩存響應(yīng)內(nèi)容。
啟用緩存后,對(duì)于“使用緩存默認(rèn)持續(xù)時(shí)間”的不同值,緩存行為會(huì)有所不同。
當(dāng)“使用緩存默認(rèn)持續(xù)時(shí)間”設(shè)置為“是”時(shí),F(xiàn)ront Door 始終采用源響應(yīng)標(biāo)頭指令。 如果缺少源指令,F(xiàn)ront Door 將緩存 1 到 3 天內(nèi)任何位置的內(nèi)容。
當(dāng)“使用緩存默認(rèn)持續(xù)時(shí)間”設(shè)置為“否”時(shí),F(xiàn)ront Door 將始終替代“緩存持續(xù)時(shí)間”(必填字段),這意味著它將緩存緩存持續(xù)時(shí)間的內(nèi)容,而忽略源響應(yīng)指令中的值。
備注
在 Front Door 設(shè)計(jì)器傳遞規(guī)則中設(shè)置的“緩存持續(xù)時(shí)間”是“最小緩存持續(xù)時(shí)間”。 如果源的緩存控制標(biāo)頭的 TTL 大于替代值,則此替代將不起作用。
如果緩存內(nèi)容的請(qǐng)求頻率不高,可能會(huì)在它們過(guò)期之前將其從 Azure Front Door 中逐出,以便為更頻繁請(qǐng)求的內(nèi)容騰出空間。