當網站載入OSS資源時瀏覽器報"blocked by CORS policy"錯誤,是因為瀏覽器的同源策略只允許網頁訪問相同協議、網域名稱和連接埠的資源。通過為OSS配置跨域資源共用(CORS)規則,可以安全授權指定網站訪問OSS資源。
工作原理
瀏覽器的同源策略要求網頁只能訪問相同協議、網域名稱和連接埠的資源,三者任一不同即為跨域:
當前頁面 | 請求資源 | 是否跨域 | 原因 |
|
| 否 | 同源 |
|
| 是 | 協議不同 |
|
| 是 | 網域名稱不同 |
|
| 是 | 連接埠不同 |
當網頁請求OSS資源時,由於OSS網域名稱與網頁網域名稱不同,瀏覽器會檢查OSS是否明確允許該跨域訪問。如果OSS未配置相應的CORS規則,瀏覽器將拒絕訪問並報錯。
通過在OSS配置CORS規則,可以告訴瀏覽器哪些跨域請求是被允許的。規則匹配成功後,OSS會在響應中返回Access-Control-Allow-Origin等頭部,瀏覽器收到後才允許網頁訪問該資源。
配置方式
前往Bucket列表,單擊目標Bucket。
在左側功能表列,選擇,單擊創建規則,根據需求設定跨域規則參數。
來源:指定哪些網站可以跨域訪問,如
https://www.example.com。允許 Methods:指定允許的HTTP方法,如
GET、PUT、POST等。允許 Headers:指定允許的要求標頭部,如
Authorization、x-oss-*等。暴露 Headers:指定前端JS可以讀取的回應標頭部,如
ETag。緩存時間(秒):指定預檢請求結果的緩衝時間。
返回 Vary: Origin:多來源或萬用字元情境下需開啟,避免緩衝汙染。
單擊確定,完成設定。
詳細的參數說明請參見CORS參數說明,具體配置值請參考下方情境樣本。
情境樣本
以下情境展示不同業務需求下的CORS配置方式。
網站靜態資源載入
網站https://www.example.com需要載入OSS上的圖片、CSS及JS檔案。
參數 | 配置值 | 說明 |
來源 |
| 只允許來自該特定網站的跨域請求。 |
允許 Methods |
|
|
允許 Headers | 留空 | 此情境為簡單請求,不觸發預檢,因此該項配置不會被用到。 |
暴露 Headers |
|
|
緩存時間(秒) | 86400 | 緩衝預檢結果24小時,減少預檢請求。 |
返回 Vary: Origin | 不勾選 | 來源單一且確定,無需處理多網域名稱緩衝問題。 |
前端直傳檔案
使用者在網頁https://app.example.com上傳頭像、文檔等檔案到OSS。
參數 | 配置值 | 說明 |
來源 |
| 確保只有該授權應用有許可權執行上傳操作。 |
允許 Methods |
|
|
允許 Headers |
| 前端直傳的安全性由臨時簽名(STS或預簽名URL)保障,使用 |
暴露 Headers |
|
|
緩存時間(秒) | 600 | 上傳操作頻率相對較低,緩衝10分鐘既能減少預檢,又能快速響應配置變更。 |
返回 Vary: Origin | 勾選 | 為未來可能的多網域名稱部署做準備,避免CDN緩衝汙染。 |
多環境支援
開發、測試、生產等多個子網域名稱(如dev.example.com、app.example.com)需要訪問同一OSS資源。
參數 | 配置值 | 說明 |
來源 |
| 使用 |
允許 Methods |
| 同時允許資源的讀取和上傳,滿足多環境下的測試需求。 |
允許 Headers |
| 多環境開發中,不同環境可能引入不同的自訂頭部,使用 |
暴露 Headers |
|
|
緩存時間(秒) | 3600 | 1小時的緩衝時間,在多環境切換和調試時較為靈活。 |
返回 Vary: Origin | 勾選 | 必須開啟。告知CDN根據 |
帶認證資訊的API式調用
前端應用https://api.example.com需要攜帶Authorization等自訂頭部訪問受保護的OSS資源。
參數 | 配置值 | 說明 |
來源 |
| 對於攜帶認證資訊的請求,來源必須是精確的、受信任的網域名。 |
允許 Methods |
| 支援對私人資源的讀取、更新和刪除全生命週期管理。 |
允許 Headers |
| 嚴禁使用 |
暴露 Headers |
|
|
緩存時間(秒) | 600 | 對於認證類請求,較短的預檢緩衝時間有助於更快地應用安全性原則變更。 |
返回 Vary: Origin | 勾選 | 告知CDN為不同Origin的請求分別緩衝,避免混淆。 |
CORS請求類型
瀏覽器根據請求特徵,將跨域請求分為簡單請求和預檢請求兩種類型,它們需要的CORS配置項略有不同。
類型 | 觸發條件 | 需要的CORS配置 |
簡單請求 | 以下條件同時滿足:
| 來源、允許Methods |
預檢請求 | 以下條件滿足任一:
| 來源、允許Methods、允許Headers |
簡單請求
簡單請求可以直接發送,處理流程如下:
瀏覽器將
Origin頭部添加到請求中,包含資源來源,例如Origin: https://www.example.com。OSS將請求的HTTP方法以及
Origin頭部的值與目標Bucket的CORS配置進行比較。如果存在匹配項,OSS將在響應中包含Access-Control-Allow-Origin頭部。瀏覽器接收響應並檢查
Access-Control-Allow-Origin值是否與原始請求的網域名稱匹配。如果匹配則請求成功,否則請求失敗。
預檢請求
預檢請求需要先詢問伺服器是否允許,處理流程如下:
瀏覽器發送一個
OPTIONS請求,包含主請求的方法(Access-Control-Request-Method)和頭部(Access-Control-Request-Headers)資訊。OSS根據CORS配置檢查請求的方法和頭部是否被允許。如果預檢請求中的任何方法或頭部值未包含在目標資源允許的方法和頭部集合中,請求將失敗,並且不會發送主請求。
預檢通過後,執行與簡單請求相同的流程。
CORS參數說明
OSS按照配置的規則順序,從上到下依次檢查,並使用第一條成功匹配的規則。一旦匹配成功,後續規則將不再檢查。
參數 | 是否必須 | 說明 |
來源 | 是 | 指定哪些網站可以跨域訪問OSS資源。
|
允許 Methods | 是 | 指定允許的HTTP方法。
|
允許 Headers | 否 | 指定實際請求中允許攜帶的HTTP頭部,作用於預檢請求。
|
暴露 Headers | 否 | 允許前端JavaScript代碼訪問OSS響應中的哪些頭部資訊。
如需在JS中擷取 |
緩存時間(秒) | 否 | 指定瀏覽器緩衝 在緩衝有效期間內,對同一資源的相同跨域請求將不再發送預檢請求。 |
返回 Vary: Origin | 否 | 決定是否在響應中添加 此頭告知CDN等中間緩衝需根據請求的 重要 當來源配置了多個網域名稱或萬用字元時,必須開啟此項。開啟後可能導致CDN快取命中率下降。 |
應用於生產環境
安全最佳實務
精確配置來源:除非Bucket完全公開,否則不建議將來源設定為
*,應精確指定網站網域名稱。收緊允許Methods:只開放業務必需的HTTP方法,如唯讀情境僅配置
GET和HEAD。明確列出允許Headers:遵循最小許可權原則,盡量明確列出必要的要求標頭,避免使用
*。
效能最佳實務
最佳化預檢緩衝:為緩衝時間設定合理的值(如86400秒),可減少預檢請求數量,降低延遲和請求成本。
評估Vary: Origin的影響:啟用此選項可解決緩衝汙染問題,但可能導致CDN快取命中率下降和回源流量成本增加。建議僅在多來源或萬用字元情境下開啟。
結合CDN使用
如果Bucket開啟了CDN加速並使用CDN網域名稱訪問,跨域請求將首先到達CDN節點。此時有兩種配置方式:
在CDN配置CORS:在CDN控制台配置跨域規則,由CDN直接返回CORS頭部。詳情請參見配置跨域資源共用。
透傳來源站點CORS頭:CDN透傳OSS返回的CORS頭部,此時需在OSS配置CORS規則。
OSS側的CORS配置僅在請求直接存取OSS來源站點網域名稱、或CDN配置為透傳來源站點回應標頭時生效。
配額與限制
每個Bucket最多可以配置20條跨域規則。
常見問題
No 'Access-Control-Allow-Origin' header is present on the requested resource報錯?
通常是由於瀏覽器緩衝了不帶CORS頭的舊響應,或者CORS規則配置不當導致請求無法匹配任何規則。建議排查步驟:
清除瀏覽器緩衝後重新測試。
檢查CORS規則的來源、允許Methods是否與實際請求匹配。
臨時建立一條寬鬆的CORS規則進行排查:來源設定為
*,允許Methods全部勾選,允許Headers設定為*,暴露Headers設定為ETag和x-oss-request-id,緩衝時間設定為0,勾選返回Vary: Origin。若問題仍未解決,在伺服器執行以下命令查看跨域要求標頭:
curl -v -H 'Origin: <來源地址>' '<OSS資源連結>' -o output.txt根據返回結果排查:

如果返回結果存在一個跨域頭且符合配置,可能是瀏覽器緩衝導致。請按Ctrl+F5清理瀏覽器緩衝,或將緩衝時間設定為0。
如果返回結果存在兩個跨域頭或不符合配置,可能是使用了CDN加速OSS。
登入CDN控制台臨時取消CDN加速確認,確認跨域問題不存在。
確認後,在CDN加速網域名稱的中設定自訂回應標頭。
若問題還是沒有解決,請參見OSS跨域資源共用(CORS)出現的常見錯誤及解決方案進一步排查。
The 'Access-Control-Allow-Origin' header has a value '...' that is not equal to the supplied origin報錯?
伺服器返回了Access-Control-Allow-Origin頭,但其值與當前請求的Origin不匹配。這通常是由於緩衝問題導致的——當配置了多個網站網域名稱訪問OSS時,瀏覽器或CDN可能記住了給其他網站的訪問許可。
解決方案:在CORS規則中開啟返回 Vary: Origin選項,或清除瀏覽器緩衝後重新訪問。
The value of the 'Access-Control-Allow-Origin' header must not be the wildcard '*' when credentials mode is 'include'報錯?
前端代碼發送了攜帶憑證的請求(Access-Control-Allow-Credentials為True),但來源被配置為萬用字元*。出於安全考慮,瀏覽器不允許使用萬用字元來源。
解決方案:
如果需要在請求中保留
Credentials資訊,將來源從*修改為具體的網域名稱(例如https://example.com),並確保伺服器端Access-Control-Allow-Credentials設定為true。如果不需要在請求中保留
Credentials資訊,在前端代碼中將xhr.withCredentials設定為false,並確保伺服器端Access-Control-Allow-Credentials設定為false或不返回該頭部。
OSS跨域載入慢如何提升載入速度?
跨域請求的載入速度取決於用戶端到OSS Bucket的物理鏈路,而非跨域本身。如果用戶端在中國香港而Bucket在中國內地,存在遠距離訪問的情況。推薦使用OSS傳輸加速進行訪問。