阿里云CDN支持在用戶請求需要回源時進行URL重寫,重寫不影響CDN的內部鏈路和緩存key,只會在CDN節點向源站發送回源請求的時候使用重寫后的URL。
工作原理
通過重寫回源URL規則,使請求URL與源站URL匹配,準確獲取源站的資源,或者傳遞指定的參數給源站。
執行規則設置為“空”或者“break”的情況下,僅重寫URL中的資源路徑部分。
執行規則設置為“enhance_break”的情況下,能夠同時重寫資源路徑和請求參數。
注意事項
單個域名可以配置的重寫回源URL規則數量上限是50個。
規則重寫按照規則列表從上到下順序依次執行,因此順序可能會影響您的重寫結果。
重寫回源URL功能在配置執行規則的情況下,對URL中參數的重寫可能會與忽略參數功能相沖突,同時配置的時候,需要注意避免配置沖突。
頁簽下的
重寫訪問URL和重寫回源URL的區別
功能 | 作用對象 | 客戶端體驗 | 應用場景 |
影響的是客戶端訪問的URL,同時也會改變CDN節點回源的URL。 | 客戶端看到的URL與實際訪問的URL不一致,會發生變化。 | 常用于將舊域名的URL遷移、映射到新域名;或者為移動端和PC端提供不同的URL。 示例:訪問 | |
影響的是CDN節點回源時訪問的URL,而客戶端訪問的URL不變。 | 客戶端看到的URL與實際訪問的URL一致,沒有變化。 | 常用于隱藏源站的真實URL結構,保護源站信息;或者通過URL映射,讓CDN節點回源到不同的源站目錄。 示例:訪問 |
重寫訪問URL示意圖
客戶端向CDN發起請求,請求的URL為
old.example.com/hello
。CDN接收到請求后,根據重寫訪問URL規則,CDN節點會在給客戶端發送的302狀態碼響應信息的HTTP Location頭部中放置新的URL地址信息,將請求的URL重寫為
new.example.com/hello
。客戶端收到302狀態碼響應之后,將會向新的URL地址發起請求。
CDN節點檢查緩存,如果緩存中有重寫后URL的內容,直接返回給客戶端;如果沒有,則CDN節點向源站發起請求,請求的URL為重寫后的
new.example.com/hello
。源站接收到請求,返回響應內容給CDN節點。
CDN節點將響應內容緩存,并返回給客戶端。
重寫回源URL示意圖
客戶端向CDN發起請求,請求的URL為
cdn.example.com/files/hello.txt
。CDN接收到請求后,檢查緩存,如果緩存中有請求URL的內容,直接返回給客戶端;如果沒有,則CDN節點根據重寫回源URL規則,將回源URL重寫為
origin.example.com/secret/files/hello.txt
,向源站發起請求。源站接收到請求后,向CDN節點返回響應內容。
CDN節點將響應內容緩存,并返回給客戶端。
配置回源URL
登錄CDN控制臺。
在左側導航欄,單擊域名管理。
在域名管理頁面,找到目標域名,單擊操作列的管理。
在指定域名的左側導航欄,單擊回源配置。
單擊重寫回源URL頁簽。
單擊添加。
根據您的需求,配置待重寫的Path、目標Path和執行規則。
參數
示例
說明
待重寫的Path
^/hello$
以正斜線(/)開頭的URL,不含http://頭及域名。必須使用PCRE正則表達式。
目標Path
/hello/test
以正斜線(/)開頭的URL,不含http://頭及域名。支持使用PCRE正則表達式。
執行規則
空
如果配置了多條規則,在匹配執行當前規則后,按照從上到下順序按依次執行可以匹配的所有規則。
break
如果配置了多條規則,若請求的URL匹配了當前規則,匹配執行完當前規則后,剩余規則將不再匹配。
只修改URL中的資源路徑部分,不修改URL的參數,不影響重寫回源URL功能對URL中參數的重寫。
enhance break
如果配置了多條規則,若請求的URL匹配了當前規則,匹配執行完當前規則后,剩余規則將不再匹配。
與break相似,但是增加了對URL中參數部分的重寫能力,對URL中參數的重寫可能會與回源參數重寫功能對URL中參數的重寫相沖突,這兩個功能同時配置的時候,需要注意避免配置沖突。
單擊確定,使重寫規則開始執行和生效。
您也可以在重寫回源URL頁面的規則列表中,單擊修改或刪除,對當前配置的規則進行相應操作。
配置示例
示例一:執行空規則。
待重寫的Path
^/hello$
目標Path
/index.html
執行規則
空
結果說明
原始請求:
http://example.com/hello
重寫后的回源請求:
http://example.com/index.html
該請求將會繼續匹配重寫回源URL規則列表中其余的規則。
示例二:執行break規則。
待重寫的Path
^/hello.jpg$
目標Path
/image/hello.jpg
執行規則
break
結果說明
原始請求:
http://example.com/hello.jpg
重寫后的回源請求:
http://example.com/image/hello.jpg
該請求將不再繼續匹配重寫回源URL規則列表中其余的規則。
示例三:執行enhance break規則。
待重寫的Path
^/hello.jpg?code=123$
目標Path
/image/hello.jpg?code=321
執行規則
enhance break
結果說明
原始請求:
http://example.com/hello.jpg?code=123
重寫后的回源請求:
http://example.com/image/hello.jpg?code=321
該請求將不再繼續匹配重寫回源URL規則列表中其余的規則。
示例四:在文件名是變量的情況下對根目錄添加URL前綴。
例如:將包含/xxx的URL(xxx代表任意文件名稱,例如:/hello.jpg、/hello.html等等)重寫為/image/xxx,即對根目錄下的任意文件的URL都插入路徑/image。
待重寫的Path
^(.*)$
說明^
表示匹配字符串的開始位置;(.*)
是一個分組,其中.
表示匹配任意單個字符(除了換行符),*
表示匹配前面的字符或分組零次或多次,可以在目標Path中通過$1來調用分組的變量內容;$
表示匹配字符串的結束位置。所以,^(.*)$
的意思是:匹配整個字符串,從開始到結束,中間可以包含任意字符(除了換行符),并將匹配到的內容捕獲到一個分組中。例如,對于字符串"hello world"
來說,^(.*)$
會匹配整個字符串,并將"hello world"
捕獲到第一個分組中。目標Path
/image$1
說明/image
表示匹配字符串"/image"
;$1
表示引用第一個捕獲分組的內容,$2
表示引用第二個捕獲分組的內容,依此類推。所以,/image$1
的意思是:匹配字符串"/image"
后面緊跟著第一個捕獲分組的內容。例如,如果第一個捕獲分組的內容是"abc"
,那么/image$1
將匹配字符串"/imageabc"
。需要注意的是,$1
引用的是捕獲分組的內容,而不是字面量"$1"
。如果想要匹配字面量"$1"
,需要使用轉義字符"\$1"
。執行規則
break
結果說明
原始請求:
http://example.com/hello.jpg
重寫后的回源請求:
http://example.com/image/hello.jpg
原始請求:
http://example.com/hello.html
重寫后的回源請求:
http://example.com/image/hello.html
該請求將不再繼續匹配回源URL重寫規則列表中其余的規則。
示例五:在文件名是變量的情況下對指定目錄添加URL前綴。
例如:將包含/live/xxx的URL(xxx代表任意文件名稱,例如:/live/hello.jpg、/live/hello.html 等等)重寫為/image/live/xxx,即對目錄/live下的任意文件的URL都插入路徑/image。
待重寫的Path
^/live/(.*)$
目標Path
/image/live/$1
執行規則
break
結果說明
原始請求:
http://example.com/live/hello.jpg
重寫后的回源請求:
http://example.com/image/live/hello.jpg
原始請求:
http://example.com/live/hello.html
重寫后的回源請求:
http://example.com/image/live/hello.html
該請求將不再繼續匹配回源URL重寫規則列表中其余的規則。
示例六:匹配多條規則時,執行空規則。
配置兩條規則如下圖所示:
結果說明:
原始請求:
http://example.com/image_01.png
重寫后的回源請求:
http://example.com/image/image_02.png
說明先匹配第一條規則,重寫為
http://example.com/image_02.png
,繼續匹配第二條規則,最終重寫為http://example.com/image/image_02.png
。
示例七:匹配多條規則時,執行break規則。
配置兩條規則如下圖所示:
結果說明:
原始請求:
http://example.com/image_01.png
重寫后的回源請求:
http://example.com/image_02.png
說明先匹配第一條規則,重寫為
http://example.com/image_02.png
,由于第一條規則設置為break,所以不再匹配后續規則。