跨域資源共享CORS(CrOSS-Origin Resource Sharing)簡(jiǎn)稱跨域訪問(wèn),是HTML5提供的標(biāo)準(zhǔn)跨域解決方案,允許Web應(yīng)用服務(wù)器進(jìn)行跨域訪問(wèn)控制,確??缬驍?shù)據(jù)傳輸?shù)陌踩浴?/p>
同源檢測(cè)
跨域訪問(wèn)是瀏覽器出于安全考慮而設(shè)置的一個(gè)限制,即同源策略,是用于隔離潛在惡意文件的關(guān)鍵安全機(jī)制。當(dāng)A、B兩個(gè)網(wǎng)站屬于不同域時(shí),來(lái)自于A網(wǎng)站頁(yè)面中的JavaScript代碼訪問(wèn)B網(wǎng)站時(shí),瀏覽器會(huì)拒絕該訪問(wèn)。
同協(xié)議、同域名(或IP)、以及同端口視為同域。兩個(gè)頁(yè)面的協(xié)議、域名和端口(若指定了端口)相同,則視為同源。下表給出了相對(duì)http://www.aliyun.com/org/test.html的同源檢測(cè)示例:
| URL | 訪問(wèn)是否成功 | 原因 |
|---|---|---|
| http://www.aliyun.com/org/other.html | 是 | 協(xié)議、域名、端口相同 |
| http://www.aliyun.com/org/internal/page.html | 是 | 協(xié)議、域名、端口相同 |
| https://www.aliyun.com/page.html | 否 | 協(xié)議不同(HTTPS) |
| http://www.aliyun.com:22/dir/page.html | 否 | 端口不同(22) |
| http://www.alibabacloud.com/help/other.html | 否 | 域名不同 |
從上表中可以看出,協(xié)議、域名或者端口不同的情況下,瀏覽器會(huì)拒絕該來(lái)源的訪問(wèn)。如果要允許這些來(lái)源的訪問(wèn),需要設(shè)置跨域資源共享規(guī)則。
注意事項(xiàng)
每個(gè)Bucket最多可以配置10條跨域規(guī)則。
當(dāng)OSS收到一個(gè)跨域請(qǐng)求(或者OPTIONS請(qǐng)求)時(shí),會(huì)讀取Bucket對(duì)應(yīng)的CORS規(guī)則,然后進(jìn)行相應(yīng)的權(quán)限檢查。OSS會(huì)依次檢查每一條規(guī)則,使用第一條匹配的規(guī)則來(lái)允許請(qǐng)求并返回對(duì)應(yīng)的Header。如果所有規(guī)則都匹配失敗,則不附加任何CORS相關(guān)的Header。
如果您開(kāi)啟了CDN加速,并且需要進(jìn)行跨域訪問(wèn)時(shí),您需要在CDN控制臺(tái)配置跨域規(guī)則。具體步驟,請(qǐng)參見(jiàn)CDN如何配置跨域資源共享(CORS)。
CORS規(guī)則
OSS支持根據(jù)需求靈活配置CORS規(guī)則,實(shí)現(xiàn)允許或者拒絕相應(yīng)的跨域請(qǐng)求。CORS規(guī)則僅用來(lái)決定是否附加CORS相關(guān)的Header,是否攔截跨域請(qǐng)求由瀏覽器決定。
以下兩種情況下需選中返回Vary: Origin以避免本地緩存錯(cuò)亂。
注意 選中返回Vary: Origin后,可能會(huì)造成瀏覽器訪問(wèn)次數(shù)或者CDN回源次數(shù)增加。
同時(shí)存在CORS和非CORS請(qǐng)求
例如實(shí)際請(qǐng)求中在<img>標(biāo)簽下發(fā)起非CORS請(qǐng)求,在fetch下發(fā)起CORS請(qǐng)求。
<!doctype html><html><head> <meta charset="UTF-8"> <title>CORS Test</title></head><body>//非CORS請(qǐng)求。<img src="https://examplebucket.oss-cn-beijing.aliyuncs.com/exampleobject.txt" alt=""><script> //CORS請(qǐng)求。 fetch("https://examplebucket.oss-cn-beijing.aliyuncs.com/exampleobject.txt").then(console.log)</script></body></html>Origin頭存在多種可能值
例如實(shí)際應(yīng)用中指定允許的跨域請(qǐng)求來(lái)源Origin頭為
http://www.example.com以及https://www.example.org。
使用OSS控制臺(tái)
登錄OSS管理控制臺(tái)。
單擊Bucket列表,然后單擊目標(biāo)Bucket名稱。
在左側(cè)導(dǎo)航欄,選擇,然后在跨域設(shè)置區(qū)域,單擊設(shè)置。
單擊創(chuàng)建規(guī)則,在創(chuàng)建跨域規(guī)則面板設(shè)置跨域訪問(wèn)參數(shù)。
參數(shù) 是否必須 說(shuō)明 來(lái)源 是 指定允許的跨域請(qǐng)求的來(lái)源。配置規(guī)則如下: 域名配置示例如下:
允許Methods 是 指定允許的跨域請(qǐng)求方法。 允許Headers 否 指定允許跨域請(qǐng)求的響應(yīng)頭。配置規(guī)則如下: 暴露Headers 否 指定允許用戶從應(yīng)用程序中訪問(wèn)的響應(yīng)頭,例如一個(gè)JavaScript的XMLHttpRequest對(duì)象。不允許使用星號(hào)(*)通配符。 建議暴露的常見(jiàn)Headers如下:
緩存時(shí)間 否 指定瀏覽器對(duì)特定資源的預(yù)?。∣PTIONS)請(qǐng)求返回結(jié)果的緩存時(shí)間,單位為秒。 返回Vary: Origin 否 配置是否返回Vary: Origin Header。 如果實(shí)際應(yīng)用中同時(shí)存在CORS和非CORS請(qǐng)求,或者Origin頭有多種可能值時(shí),建議選中返回Vary: Origin以避免本地緩存錯(cuò)亂。
注意 選中返回Vary: Origin后,可能會(huì)造成瀏覽器訪問(wèn)次數(shù)或者CDN回源次數(shù)增加。
有關(guān)以上配置的各項(xiàng)跨域訪問(wèn)參數(shù)的更多信息,請(qǐng)參見(jiàn)PutBucketCors。
x-oss-request-id
在您使用OSS服務(wù)遇到問(wèn)題時(shí),憑借此Request ID請(qǐng)求技術(shù)支持協(xié)助排查并解決您遇到的問(wèn)題。
ETag
可用于檢查Object內(nèi)容是否發(fā)生變化。
格式為key:value,例如content-type:text/plain,大小寫不敏感。
允許多條匹配規(guī)則,多條規(guī)則需換行填寫。
每條匹配規(guī)則最多使用一個(gè)星號(hào)(*)通配符。建議沒(méi)有特殊需求的情況下設(shè)置為星號(hào)(*)。
匹配指定域名時(shí),填寫完整域名,例如:https://www.example.com。
匹配泛二級(jí)域名,可使用通配符星號(hào)(*)。例如:https://*.example.com。
匹配所有域名,可直接填寫通配符星號(hào)(*)。
允許多條匹配規(guī)則,多條規(guī)則需換行填寫。
域名需包含協(xié)議名,例如HTTP、HTTPS。
支持通配符星號(hào)(*),每條匹配規(guī)則允許使用最多一個(gè)星號(hào)(*)。
若域名使用的不是默認(rèn)端口,還需要攜帶端口號(hào)。例如:https://www.example.com:8080。
單擊確定。
