全部產品
Search
文件中心

Object Storage Service:配置跨域資源共用 (CORS)

更新時間:Sep 18, 2025

當網站載入OSS資源時,瀏覽器報"blocked by CORS policy"錯誤,是因為瀏覽器的同源策略:只允許網頁訪問相同協議、網域名稱和連接埠的資源。比如網站https://www.example.com無法直接存取不同網域名稱的OSS資源https://example-bucket.oss-cn-hangzhou.aliyuncs.com/test.jpgimage通過為OSS配置跨域資源共用(CORS)規則,可以安全授權指定網站訪問OSS資源,讓網頁直接操作檔案。

工作原理

CORS請求分為兩種類型:簡單請求和預檢請求。簡單請求可以直接發送,預檢請求必須先獲得許可才能發送主請求。

如果滿足以下任何一種情況,系統將對請求執行預檢:

  • 請求使用的是GETHEADPOST以外的方法。

  • 請求使用POST方法且 Content-Type 不是 text/plainapplication/x-www-form-urlencoded 或 multipart/form-data

  • 請求設定了自訂頭部,例如x-oss-*

當瀏覽器向OSS發出簡單請求時,會發生以下過程:

  1. 瀏覽器將Origin頭部添加到請求中。Origin頭部包含相應資源的來源,例如Origin: https://www.example.com

  2. OSS將請求的HTTP方法以及Origin頭部的值與目標Bucket的CORS配置進行比較,尋找匹配項。如果存在匹配項,OSS將在響應中包含Access-Control-Allow-Origin頭部。Access-Control-Allow-Origin頭部包含初始請求的Origin頭部的值。

  3. 瀏覽器接收響應並檢查Access-Control-Allow-Origin值是否與原始請求的網域名稱匹配。如果匹配,則請求成功。如果不匹配,或者響應中不存在 Access-Control-Allow-Origin頭部,則請求失敗。

預檢請求首先執行以下步驟,成功後再執行與簡單請求相同的過程:

  1. 瀏覽器發送一個OPTIONS請求,包含主請求的方法(Access-Control-Request-Method)和頭部(Access-Control-Request-Headers)資訊

  2. OSS根據CORS配置檢查請求的方法和頭部是否被允許。如果預檢請求中的任何方法或標題值未包含在目標資源允許的方法和標題集合中,請求將失敗,並且不會發送主請求。

網站靜態資源載入

網站 https://www.example.com 需要載入存放在OSS上的圖片、CSS及JS檔案。

步驟一:配置CORS規則

登入OSS管理主控台,進入目標Bucket的資料安全 > 跨網域設定,建立規則如下:

參數

配置值

說明

來源

https://www.example.com

只允許來自該特定網站的請求,保障資源安全。

允許Methods

GET,HEAD

GET下載資源,HEAD用於緩衝校正。

允許Headers

留空

此情境為簡單請求,不觸發預檢,因此該項配置不會被用到,留空即可。

暴露Headers

ETag,Content-Length

  • ETag: 允許瀏覽器通過HEAD請求進行緩衝校正,若檔案未變則返回304 Not Modified,避免重複下載。

  • Content-Length: 可用於在最上層顯示資源載入進度。

緩衝時間

86400

緩衝預檢結果24小時,減少未來可能產生的預檢請求。

返回Vary Origin

不勾選

由於來源是單一且確定的,無需開啟此項來處理多網域名稱緩衝問題。

步驟二:驗證配置

訪問https://www.example.com,確認OSS資源(如圖片)載入正常,且瀏覽器控制台無CORS錯誤。

前端直傳檔案

使用者在網頁 https://app.example.com 上,將頭像、文檔等檔案直接上傳到OSS。

步驟一:配置CORS規則

登入OSS管理主控台,進入目標Bucket的資料安全 > 跨網域設定,建立規則如下:

參數

配置值

說明

來源

https://app.example.com

確保只有該授權應用有許可權執行上傳操作。

允許Methods

PUT, POST

PUT或POST是執行上傳操作必需的HTTP方法。

允許Headers

*

前端直傳的安全性不依賴固定的Authorization頭,而是由有時效性的臨時簽名 (STS或預簽名URL)保障。使用*可相容SDK攜帶的多種頭部(如x-oss-meta-*),簡化配置且無安全風險。

暴露Headers

ETag, x-oss-request-id

  • ETag:是檔案上傳成功的唯一標識,用於後續校正。

  • x-oss-request-id:若上傳失敗,前端可捕獲此ID,在尋求支援人員時提供,以便快速定位問題。

緩衝時間

600

上傳操作頻率相對較低,緩衝10分鐘既能減少預檢,又能快速響應配置變更。

返回Vary Origin

勾選

為未來可能的多網域名稱部署(如測試環境)做準備,避免CDN緩衝汙染。

步驟二:驗證配置

https://app.example.com頁面執行上傳操作,確認檔案成功上傳至OSS,且瀏覽器控制台無CORS錯誤。

多環境支援

開發、測試、生產等多個子網域名稱(如dev.example.comapp.example.com)需要訪問同一個OSS資源。

步驟一:配置CORS規則

登入OSS管理主控台,進入目標Bucket的資料安全 > 跨網域設定,建立規則如下:

參數

配置值

說明

來源

https://*.example.com

使用*萬用字元一次性授權example.com下所有https協議的子網域名稱。

允許Methods

GET,PUT,POST

同時允許資源的讀取和上傳,滿足多環境下的測試需求。

允許Headers

*

多環境開發中,不同環境、不同功能可能引入不同的自訂頭部。使用*可以避免頻繁修改CORS規則。

暴露Headers

ETag, x-oss-request-id

同時支援下載校正和上傳結果反饋。

緩衝時間

3600

1小時的緩衝時間,在多環境切換和調試時較為靈活。

返回Vary Origin

勾選

必須開啟。告知CDN根據Origin頭區分緩衝,防止多環境間緩衝錯亂。

步驟二:驗證配置

分別在 https://dev.example.com 和 https://app.example.com 上進行訪問或上傳測試,確認操作均成功。

帶認證資訊的API式調用

前端應用https://api.example.com需要攜帶 Authorization 等自訂頭部訪問受保護的OSS資源。

步驟一:配置CORS規則

登入OSS管理主控台,進入目標Bucket的資料安全 > 跨網域設定,建立規則如下:

參數

配置值

說明

來源

https://api.example.com

對於攜帶認證資訊的請求,來源必須是精確的、受信任的網域名。

允許Methods

GET,PUT,DELETE

支援對私人資源的讀取、更新和刪除全生命週期管理。

允許Headers

authorization, content-type, x-oss-*

嚴禁使用*。明確列出所有必要的要求標頭,遵循最小許可權原則,避免泄露不必要的頭部資訊。

暴露Headers

ETag,x-oss-request-id

提供操作成功後的校正標識和失敗後的排錯ID

緩衝時間

600

對於認證類請求,較短的預檢緩衝時間(10分鐘)有助於更快地應用安全性原則變更。

返回Vary Origin

勾選

告知CDN為不同Origin的請求分別緩衝,避免混淆。

步驟二:驗證配置

https://api.example.com頁面發起帶Authorization頭的請求,確認能成功訪問受保護的OSS資源。

應用於生產環境

安全最佳實務

遵循最小許可權原則。

  • 精確配置來源(AllowedOrigin):除非 Bucket 是完全公開的,否則嚴禁將AllowedOrigin設定為*。應精確指定提供服務的網站網域名稱,例如https://www.example.com

  • 收緊允許Methods(AllowedMethod):只開放業務必需的 HTTP 方法。如果網站只需要讀取資料,則只配置GETHEAD

  • 具體指定允許Headers(AllowedHeader):對於攜帶認證資訊(如Authorization頭)的請求,嚴禁使用*,必須明確列出所有必要的要求標頭。

效能最佳實務

  • 最佳化預檢緩衝:為 緩衝時間 (MaxAgeSeconds) 設定一個合理的值(如 86400 秒,即24小時),可以顯著減少預檢請求的數量,降低延遲和請求成本。

  • 評估Vary: Origin 的影響:啟用 返回 Vary: Origin 雖然可以解決緩衝汙染問題,但會增加CDN緩衝的複雜性,可能導致快取命中率下降和回源流量增加,從而產生額外成本和延遲。請在評估後使用。

CDN加速情境

如果Bucket開啟了CDN加速並使用CDN網域名稱訪問,跨域請求將首先到達CDN節點。此時,必須在CDN控制台配置CORS規則,而不是在OSS。OSS側的CORS配置僅在請求直接存取OSS來源站點網域名稱時生效。詳情請參見配置跨域資源共用

CORS 規則參數說明

每個Bucket最多可以配置20條跨域規則。OSS按照配置的規則順序,從上到下依次檢查,並使用第一條成功匹配的規則。一旦匹配成功,後續規則將不再檢查。

參數

是否必須

說明

來源 (AllowedOrigin)

指定哪些網站(來源域)可以跨域訪問OSS資源。

  • 格式為協議://網域名稱[:連接埠],例如https://www.example.com

  • 支援*萬用字元,但每個來源中最多隻能使用一個。

    • 有效樣本https://*.example.comhttp://localhost:*

    • 無效樣本https://*.example.*https://*

  • 允許多個來源,每行一個。

允許 Methods (AllowedMethod)

指定允許的HTTP方法。

  • 可選值:GET,PUT,POST,DELETE,HEAD

  • 允許多個方法。

允許 Headers (AllowedHeader)

作用於預檢請求,決定了實際請求中允許攜帶的HTTP頭部。

  • 支援*萬用字元,表示允許所有頭部。

  • 允許多個Header,每行一個,大小寫不敏感。

暴露 Headers (ExposeHeader)

允許前端JavaScript代碼可以訪問到OSS響應中的哪些頭部資訊。

  • 不支援*萬用字元。

  • 允許多個 Header,每行一個。

  • 使用情境:如需在 JS 中擷取上傳檔案的ETagx-oss-request-id,必須在此處添加ETagx-oss-request-id

緩衝時間 (MaxAgeSeconds)

指定瀏覽器緩衝OPTIONS預檢請求結果的時間(單位:秒)。

  • 作用:在緩衝有效期間內,對同一資源的相同跨域請求將不再發送預檢請求,以最佳化效能。

返回 Vary: Origin

決定是否在響應中添加Vary: Origin頭。此頭告知CDN等中間緩衝,需根據請求的Origin頭來區分緩衝版本,以避免多來源訪問時的緩衝汙染問題。

  • 使用情境:當來源配置了多個網域名稱或萬用字元時,必須開啟此項以避免緩衝汙染。

重要

開啟此項可能導致CDN快取命中率下降。

常見問題

報錯No 'Access-Control-Allow-Origin' header is present on the requested resource.

通常是由於瀏覽器緩衝了不帶CORS頭的舊響應,或者CORS規則配置不當導致請求無法匹配任何規則。

建議先清除瀏覽器緩衝進行測試。如果仍然報錯,請參見以下步驟排查CORS跨域規則是否設定正確:

  1. 登入OSS管理主控台

  2. 單擊Bucket列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇資料安全>跨網域設定

  4. 在跨網域設定頁面,單擊建立規則

  5. 建立跨域規則面板,將來源設定為*允許Methods全部勾選,允許Headers設定為*暴露Headers設定為ETagx-oss-request-id緩衝時間(秒)設定為0,選中返回Vary: Origin,然後單擊確定

  6. 若問題仍然未解決,請任意登入一台伺服器,執行以下命令,查看跨域要求標頭。

    curl -v -o output_file.txt -H 'Origin:[$URL2]' '[$URL1]'
    說明
    • [$URL1]為需要請求的OSS資源連結。

    • [$URL2]為您配置跨域規則的來源地址。

    系統顯示類似如下。

    • 如果出現返回結果存在一個跨域頭且符合您配置的跨域頭,可能是由於您第一次請求沒有觸發跨域,返回的資料被本機快取;而第二次觸發跨域的請求沒有請求伺服器端,而是直接擷取本地的緩衝,導致跨域校正失敗。 請參考以下解決方案:

      • 在瀏覽器頁面單擊Ctrl+F5,清理瀏覽器緩衝,然後在測試跨域問題是否還存在。

      • 您將該OSS資源跨網域設定的緩衝時間設定為0,避免該資源在用戶端進行緩衝,每次請求都會重新在伺服器端擷取鑒權資訊。

        說明

        您可以在上傳檔案時設定檔案的cache-control為no-cache,已經上傳的檔案可以使用ossutil工具變更,如何設定cache-control請參見 set-meta(管理檔案中繼資料)

      • 使用CDN加速OSS,這樣CDN所有請求都會返回CORS頭。

    • 如果返回結果存在兩個跨域頭或者不符合您在OSS配置的跨域頭,可能是由於使用了CDN加速OSS:

      1. 登入CDN控制台,臨時取消CDN加速OSS,確認跨域問題不存在。

      2. 確認後,單擊具體的網域名稱,依次單擊緩衝配置 > 節點HTTP回應標頭

      3. 根據您的實際情況,設定自訂HTTP回應標頭。

  7. 若跨域問題還是沒有解決,請參見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選項,這樣可以避免不同網站間的緩衝混亂;或者清除瀏覽器緩衝後重新訪問。

報錯Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.

由於前端代碼發送了攜帶憑證的請求,Access-Control-Allow-CredentialsTrue,但Access-Control-Allow-Origin的值被配置為萬用字元*,出於安全考慮,不允許使用萬用字元來源,以防止任意域訪問資源並擷取Credentials資訊(包括Cookies、Authorization Headers等敏感性資料)。

  • 如果您需要在要求標頭中保留Credentials資訊,將Access-Control-Allow-Origin的值從萬用字元*修改為具體的網域名稱(例如:https://example.com)。

  • 如果您不需要在要求標頭中保留Credentials資訊,您可以在前端代碼中將xhr.withCredentials設定為false,並確保伺服器端的Access-Control-Allow-Credentials設定為false

OSS跨域載入慢如何提升載入速度?

跨域請求實際上是請求Header中攜帶Origin頭請求OSS Bucket中的資源,所以載入快慢不取決於跨域,而是用戶端到OSS Bucket的物理鏈路。如果用戶端在中國香港,Bucket是中國內地的,那訪問是存在遠距離訪問的情況,推薦您使用OSS傳輸加速地址來訪問,這樣會對鏈路有加速最佳化,詳情請參見傳輸加速

說明

傳輸加速功能可以讓全球各地的客戶使用最佳化後的網路來傳輸資料,極大地提升上傳和下載速度,讓不同地區的使用者都能有很好的訪問體驗。