全部產品
Search
文件中心

:設定跨域規則後調用OSS時仍然報No'Access-Control-Allow-Origin'的錯誤原因和解決方案

更新時間:Jun 19, 2024

問題描述

為了實現跨域訪問,保證跨域資料轉送的安全進行,在OSS控制台設定了跨域CORS規則後,通過SDK進行程式調用時報以下錯誤。

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

問題原因

出現跨域問題的原因如下:

  • 跨域CORS規則設定異常: 未正確設定CORS規則。

  • 瀏覽器緩衝:設定了CORS跨域規則,但是存在瀏覽器緩衝,導致讀取了緩衝中未含有跨域頭的Response Header。

解決方案

不同的問題原因對應的解決方案不同,建議先清除瀏覽器緩衝進行測試。如果仍然報錯,請參見以下步驟排查CORS跨域規則是否設定正確:

  1. 登入OSS管理主控台

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

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

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

  5. 建立跨域規則面板,將來源設定為*允許Methods全部勾選,允許Headers設定為*暴露Headers設定為ETagx-oss-request-id緩衝時間設定為0,選中返回Vary: Origin,然後單擊確定。關於如何設定跨域規則,請參見設定跨域訪問

    說明

    選中 返回Vary: Origin以避免本機快取錯亂,可能會造成瀏覽器訪問次數或者CDN回源次數增加。

    image

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

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

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

    系統顯示類似如下。

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

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

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

        說明

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

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

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

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

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

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

  7. 若跨域問題還是沒有解決,請參見OSS跨域資源共用(CORS)出現的常見錯誤及解決方案進一步排查處理。