返回列表

阿里雲帳號充值辦理 阿裡雲 CDN 加速 OSS 防盜鏈設定錯誤導致資源無法加載(403 報錯)排查

阿里雲國際 / 2026-08-01 15:41:30

問題現象與背景

一個常見的線上故障是:網站前端頁面正常,但靜態資源(圖片、CSS、JS、字體)經由阿裡雲 CDN 加速後無法加載,瀏覽器控制台報 403,刷新仍在。用戶體感是頁面樣式錯亂、圖片全掛、按鈕不可用。這類問題多半與防盜鏈(Referer 校驗)或權限配置有關,尤其在 OSS 作為源站、CDN 做分發時,兩端的策略疊加更容易產生誤判。

理解流量路徑有助快速定位:用戶請求命中 CDN 邊緣節點,若有可用緩存則直接回覆;若無則回源到 OSS 拉取並緩存。403 可能由 CDN 自身的訪問控制返回,也可能來自 OSS 源站(被 CDN 轉發給客戶端)。找到 403 的真正來源,是排查的第一步。

403 來源判斷:是 CDN 還是 OSS

通過響應頭判斷

觀察瀏覽器網路面板或使用 curl -I 查看響應頭,常見特徵如下:

  • 若為 CDN 返回的 403:通常會看到類似 'Via'、'X-Cache'、'Age'、邊緣節點標識等,且沒有 OSS 專屬頭(如 'x-oss-request-id')。有時會有錯誤命中描述或 CDN 特有標籤。
  • 若為 OSS 返回的 403:響應中常帶有 'x-oss-request-id'、'x-oss-bucket-region' 等,Body 可能包含 AccessDenied 或 HotlinkDenied 之類字樣。CDN 只作為通道把 403 轉回客戶端。
curl -I https://cdn.example.com/static/app.css
curl -I -H 'Referer: https://www.example.com/' https://cdn.example.com/static/app.css

比較兩次請求的頭部與狀態碼,如果加上 Referer 後恢復正常,基本可以鎖定為防盜鏈策略問題。

使用直連 OSS 對照

用同一路徑直連 OSS 公網域名(如 bucket.oss-cn-shanghai.aliyuncs.com)測試:

curl -I https://bucket.oss-cn-shanghai.aliyuncs.com/static/app.css
curl -I -H 'Referer: https://www.example.com/' \
  https://bucket.oss-cn-shanghai.aliyuncs.com/static/app.css

阿里雲帳號充值辦理 如果直連也 403,問題在 OSS;如果直連正常而 CDN 403,問題在 CDN 層或回源行為。這個對照可以把問題一分為二,大幅縮小範圍。

常見誤配置與成因

CDN 防盜鏈白名單漏配或錯配

最典型的坑是開啟了 CDN Referer 白名單,但未將實際來源域名補全。例如:

  • 只配置了 'example.com',忘了 '*.example.com',導致 sub.example.com 來源被擋。
  • 用戶從 'https://cdn.example.com' 加載資源,而白名單未包含 'cdn.example.com' 本身。
  • 把協議寫進白名單(如 'https://example.com'),實際上白名單僅匹配域名,造成規則不生效。
  • 本地調試從 'localhost:3000' 或 '127.0.0.1' 加載,未加入白名單。

此外,黑白名單模式切換也容易遺漏。開啟白名單後,如果沒有勾選允許空 Referer,來自部分環境的合法請求會因為 Referer 缺失而被阻擋。

OSS 防盜鏈與 CDN 疊加衝突

同時在 CDN 和 OSS 都開防盜鏈,容易產生互相掣肘:

  • CDN 允許某些來源,但回源時仍把 Referer 透傳到 OSS;若 OSS 白名單沒有這些來源或不允許空 Referer,OSS 會返回 403。
  • 有些團隊嘗試在 CDN 回源時移除 Referer,想繞過 OSS 防盜鏈,但 OSS 若不允許空 Referer,依然 403。

最佳實踐通常是:防盜鏈統一在 CDN 層實施,OSS 關閉防盜鏈;或者兩端策略保持一致,至少要確保 OSS 允許空 Referer 或包含 CDN 加速域。

允許空 Referer 的取捨

許多客戶端場景會天然產生空 Referer,例如:

  • HTTPS 頁面跨到 HTTP 資源(部分情況下瀏覽器不帶 Referer)。
  • 某些 App WebView、離線包、桌面客戶端、監控探測、curl 測試。
  • 站點設置了嚴格的 Referrer-Policy(如 'no-referrer')。

若不允許空 Referer,這些合法流量會被擋。權衡方案是:在 CDN 允許空 Referer,同時配合更強的鑑權(如 CDN 鑑權 Token)來代替單純的防盜鏈。

跨協議與 Referrer-Policy 影響

從 HTTPS 頁面請求 HTTP 資源會有多重問題:一是瀏覽器可能直接攔截(混合內容);二是即便允許,也可能不帶 Referer;三是服務端若部署了嚴格的 Referrer-Policy,會導致跨域跨協議請求 Referer 被裁剪或清空。這些都會觸發依賴 Referer 的防盜鏈誤殺。解法是強制全站 HTTPS、對靜態域名部署證書、統一協議。

403 被快取

CDN 默認可能緩存源站響應碼,包括 403。當首個回源因白名單不匹配導致 403,被緩存後,即使你修正配置,一段時間內仍會命中已緩存的 403。需要手動刷新資源或調整緩存規則(例如不緩存 4xx,或縮短 4xx 的 TTL)。

私有桶、簽名與回源鑑權

當 OSS Bucket 設為私有,若未配置 CDN 回源鑑權(授權 CDN 以角色訪問 OSS),或 URL 簽名過期、簽名參數被 CDN 規則誤刪,都會導致回源 403。兩種易混場景:

  • 你使用 OSS 簽名 URL,但 CDN 開啟了忽略部分 Query 或重寫,導致簽名校驗失敗。
  • 你計畫改用 CDN 鑑權(時間戳防盜鏈),但 OSS 仍是私有且無回源授權,CDN 取源時被拒。

做法是:其一,保持 OSS 私有,開啟 CDN 回源鑑權並僅允許 CDN 訪問;其二,或者保持 OSS 公開讀,將鑑權收斂到 CDN 層,不同方案不要混用。

其他干擾因素(IP 訪問控制、UA)

CDN 還可能配置了 IP 黑白名單、UA 黑名單、地區封禁等。如果 403 僅出現在某些網段或設備上,留意這些訪問控制。這些控制和防盜鏈疊加時,現象容易混淆。

從零開始的排查流程

快速定位

  • 確認影響範圍:是否僅部分資源、某個目錄、某些用戶?是否僅手機端或特定瀏覽器?
  • 對比域名:相同資源用加速域名與直連 OSS 分別測試,觀察 403 是否一致。
  • 加 Referer 測試:curl 分別帶與不帶 Referer,確認防盜鏈是否為主因。
  • 阿里雲帳號充值辦理 看響應頭:是否有 OSS 專屬頭或 CDN 邊緣標識,鎖定 403 來源。

命令行驗證腳本

# 1) 不帶 Referer 測 CDN
curl -I https://cdn.example.com/path/a.png

# 2) 帶站點 Referer 測 CDN
curl -I -H 'Referer: https://www.example.com/' \
  https://cdn.example.com/path/a.png

# 3) 直連 OSS(不帶/帶 Referer)
curl -I https://bucket.oss-cn-shanghai.aliyuncs.com/path/a.png
curl -I -H 'Referer: https://www.example.com/' \
  https://bucket.oss-cn-shanghai.aliyuncs.com/path/a.png

# 4) 嘗試子域 Referer
curl -I -H 'Referer: https://sub.example.com/' \
  https://cdn.example.com/path/a.png

把四組結果列在一起對比,基本可定位是 CDN 規則、OSS 規則,還是兩者疊加。

對比日誌與時間線

阿里雲帳號充值辦理 在阿裡雲控制台下載對應時段的 CDN 訪問日志與 OSS 訪問日志。以請求時間、URL、狀態碼對齊:

  • 若 CDN 日誌顯示在邊緣直接 403,且沒有回源記錄,說明是 CDN 訪問控制所致。
  • 若 CDN 日誌顯示回源,OSS 日誌對應條目為 403,則來源於 OSS,需查看 OSS 防盜鏈或權限配置。

同時注意第一個 403 出現的時間,是否緊跟某次配置變更或發版,這有助於快速回滾或鎖定改動。

阿里雲帳號充值辦理 修復與配置建議(阿裡雲控制台)

CDN 配置

  • 防盜鏈:選擇白名單模式,加入 'example.com' 與 '*.example.com',包含加速域名本身(如 'cdn.example.com')、常用子域名、測試域名、'localhost' 與 '127.0.0.1'。視情況勾選允許空 Referer。
  • 回源設置:回源 HOST 指向 OSS 公網域名(如 'bucket.oss-cn-hangzhou.aliyuncs.com')。若 OSS 保留防盜鏈,避免在回源時移除 Referer;如果確需移除,務必在 OSS 允許空 Referer。
  • 緩存規則:對 4xx 設置較短 TTL 或不緩存;修復後立即刷新關鍵資源或整目錄。
  • 鑑權:如需更強保護,開啟 CDN 時間戳鑑權,使用 URL 中的簽名與過期時間控制訪問。與防盜鏈同時開啟時,先驗證鑑權鏈路穩定,再逐步收緊 Referer 規則。

OSS 配置

  • 防盜鏈:推薦在使用 CDN 時關閉 OSS 防盜鏈,把控制收斂到 CDN。若業務需要保留,至少加入 CDN 加速域名,並允許空 Referer,以免透傳或移除 Referer 導致誤判。
  • 桶權限:公有讀對純靜態公共資源較簡單;如需私有,請配置 CDN 回源鑑權(為 CDN 授權訪問私有桶),避免依賴臨時簽名 URL 被規則改寫。
  • 跨域:若資源需要被前端 XHR 或字體跨域引用,同步配置 CORS;雖與 403 防盜鏈不同維度,但同時缺失時會造成混淆。

緩存策略修正

  • 將錯誤碼緩存 TTL 調短;對 403 設置 0 或極短,以便調整生效更快。
  • 按目錄細分緩存策略,避免全站規則影響局部敏感資源。
  • 對帶簽名的資源保留完整 Query 參數參與緩存鍵;避免忽略 Query 導致簽名失效或命中錯誤緩存。

實戰案例復盤

案例一:手機端 H5 間歇性 403

現象:僅部分手機瀏覽器報 403,PC 基本正常。排查發現頁面頭部設置了嚴格的 Referrer-Policy,且部分跳轉鏈路從 HTTPS 頁面請求 HTTP 圖片,瀏覽器不帶 Referer。CDN 白名單未勾選允許空 Referer,導致誤殺。修復:全站升 HTTPS、CDN 白名單允許空 Referer、同步部署 CDN 鑑權提高安全性。問題即刻消失。

案例二:新子域上線後靜態樣式全掛

現象:新上線子站 'sub2.example.com' 能打開頁面,但 CSS 與字體全 403。原因:CDN 防盜鏈白名單只有 'example.com' 和 'www.example.com',未包含 '*.example.com'。加上通配並刷新緩存後恢復。教訓:變更域名體系時,先更新白名單與證書覆蓋,並在預發環境用相同域名回歸測試。

案例三:私有桶 + 簽名 URL 與 CDN 規則衝突

現象:部分帶簽名的資源 403,偶發。原因:CDN 規則對 Query 做了規範化處理,去掉了冗餘參數,誤刪了簽名必需字段;同時 CDN 還緩存了第一次的 403。修復:在緩存鍵中保留全部 Query,對 4xx 不緩存,並改為使用 CDN 回源鑑權,避免在 URL 上暴露簽名。

最佳實踐與避坑清單

  • 將防盜鏈控制收斂在 CDN,OSS 端關閉或設置為寬鬆(允許空 Referer、包含 CDN 加速域)。
  • 白名單同時包含根域與通配('example.com' 與 '*.example.com'),並納入加速域、自身站點域、測試域、localhost。
  • 不要在白名單中寫入協議或路徑;僅填域名,逗號分隔,避免空格與全形符號。
  • 全站 HTTPS,避免混合內容;必要時調整 Referrer-Policy,或在 CDN 允許空 Referer。
  • 針對 4xx 設置不緩存或極短 TTL;修配置後立即刷新緩存,避免舊 403 阻塞驗證。
  • 私有桶優先採用 CDN 回源鑑權;若使用簽名 URL,確保 CDN 不忽略關鍵 Query、無 URL 重寫副作用。
  • 對關鍵問題準備一鍵自查腳本:curl 帶與不帶 Referer、直連與經 CDN 對照。
  • 上線流程加入配置檢查清單:新增域名、證書、CDN 白名單、緩存規則、OSS 防盜鏈一致性。
  • 觀察日誌:建立 CDN 與 OSS 日誌對齊方法,遇到 403 優先定位來源層級。
  • 安全策略多層疊加時,逐層打開觀察法(先關 OSS,再關 CDN 防盜鏈,再關鑑權),快速找到臨界點。

收尾與風險提示

依賴 Referer 的防盜鏈本質上是一種脆弱的保護,受瀏覽器策略、跨協議、客戶端行為影響很大。當你需要更強的保護,應該把重心放在 CDN 鑑權與私有桶回源授權上,將可控的安全校驗固化在邊緣,並把 OSS 隱身在後端。排查時,謹記三步:先定 403 來源,再驗證 Referer 與白名單,最後處理緩存與權限。這條路走通一次,今後遇到同類問題基本可以在十分鐘內收束。

阿里雲帳號充值辦理 最後,建立一份針對貴團隊的環境清單:域名體系、環境域(測試/預發/線上)、CDN 規則、OSS 桶權限、鑑權方式、緩存策略、上線檢查表。把知識沉澱成制度,才能把故障關在門外。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系