博客 / 詳情

返回

藍易雲cdn:Nginx的referer參數的用法和原理

在藍易雲 CDN 這類多節點架構裏,合理利用 Nginx 的 <span style="color:red">referer</span> 能把防盜鏈、流量治理和來源統計捏在一起做好。下面我直接拆開講原理 + 配置方法 + 注意事項,儘量説人話,但技術細節一個都不落下 🙂


一、referer 的本質:瀏覽器帶來的“來源線索”

  1. 瀏覽器在發起請求時,會把當前頁面地址寫進 HTTP 頭部 <span style="color:red">Referer</span> 字段。
  2. Nginx 會把這個頭映射成變量:<span style="color:red">$http_referer</span>,供後續指令判斷。
  3. 在 CDN 場景下:

    • 用户 → 藍易雲 CDN 節點:Referer 通常是業務站點頁面地址。
    • CDN 節點 → 源站 Nginx:Referer 一般會被原樣轉發,或者由前置層二次設置(取決於你在 CDN 側的配置)。

⚠️ 關鍵認知:

  • <span style="color:red">Referer 可以被偽造</span>,不能當強安全手段。
  • HTTPS → HTTP、隱私插件、部分小程序/客户端,會直接不帶 Referer。
  • 所以 referer 適合做的是:<span style="color:red">防止低成本盜鏈 + 過濾明顯異常流量</span>,而不是絕對防禦。

二、Nginx referer 模塊的三個關鍵點

Nginx 裏和 Referer 相關的核心指令在 ngx_http_referer_module 中,主要就三件事:

  1. <span style="color:red">valid_referers</span>:定義什麼是“合法來源”。
  2. <span style="color:red">$invalid_referer</span>:自動標記當前請求是否是非法來源(1 = 非法,0 = 合法)。
  3. referer_hash_max_size / referer_hash_bucket_size:高併發、大量域名白名單時的哈希表容量調優。

理解成一句話:

你用 valid_referers 畫出一圈“可信域名”,Nginx 用 $invalid_referer 告訴你當前請求在圈內還是圈外,然後你決定放行、重定向還是直接 403。🚦

三、基礎用法:靜態資源防盜鏈(最常見場景)

示例一:簡單白名單防盜鏈

location /static/ {
    valid_referers none blocked *.lanyicdn.com *.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

配置逐行解釋

  1. location /static/ { ... }

    • 作用:只對 /static/ 下的靜態資源(圖片、JS、CSS 等)啓用規則,避免誤傷 API 接口。
    • 你也可以改成 /images//assets/,按你的目錄規劃來。
  2. valid_referers none blocked *.lanyicdn.com *.example.com;

    • <span style="color:red">valid_referers</span>:定義合法來源列表。
    • none:允許沒有 Referer 的請求(比如用户直接在瀏覽器地址欄敲靜態資源地址、小程序請求等)。
    • blocked:允許頭部被中間設備“遮蔽”的情況(Referer 格式異常時會識別為 blocked)。
    • *.lanyicdn.com:允許從你藍易雲 CDN 業務域名下所有子域發起的請求,比如 www.lanyicdn.comimg.lanyicdn.com
    • *.example.com:允許你的業務源站或主站域名。
      → 這一行的本質是:<span style="color:red">白名單模式</span>,列出你信任的上游頁面域名。
  3. if ($invalid_referer) { return 403; }

    • $invalid_referer

      • 0:在白名單內(合法)。
      • 1:不在白名單內(非法來源,疑似盜鏈或直接構造)。
    • if ($invalid_referer):表示“如果是非法來源”。
    • return 403;:直接返回 403 禁止訪問,既節省帶寬,又給對方一個明確的拒絕。
      → 在藍易雲場景可以替換成跳轉到一個提示頁面,減緩用户抱怨。

四、進階玩法:用 map 做更靈活的控制

在複雜架構裏(多業務域、多 CDN 域名、多源站),直接在 location 裏寫 valid_referers 會越寫越亂。更乾淨的方式是用 <span style="color:red">map</span> 預處理 Referer。

示例二:map + 變量控制防盜鏈

map $http_referer $referer_ok {
    default                           0;
    "~*://(www\.)?lanyicdn\.com"      1;
    "~*://(img\.)?lanyicdn\.com"      1;
    "~*://(www\.)?example\.com"       1;
}

server {
    location /static/ {
        if ($referer_ok = 0) {
            return 403;
        }
        # 其他緩存、壓縮配置...
    }
}

配置逐行解釋

  1. map $http_referer $referer_ok { ... }

    • 含義:根據請求頭的 <span style="color:red">$http_referer</span>,計算出一個新變量 <span style="color:red">$referer_ok</span>
    • 優點:

      • 規則集中管理。
      • 能寫更復雜的正則匹配。
      • 後續 server / location 都能複用這一個判定結果。
  2. default 0;

    • 沒匹配到任何規則 → 默認標記為 0 = 不合法。
    • 等價於“黑名單世界中的默認拒絕”。
  3. "~*://(www\.)?lanyicdn\.com" 1; 等幾行

    • ~*:大小寫不敏感正則。
    • ://(www\.)?lanyicdn\.com:匹配從 http://https:// 打開的頁面,域名為 lanyicdn.comwww.lanyicdn.com
    • 右側 1:只要命中,$referer_ok 就置為 1,表示合法。
    • 多行規則可以涵蓋不同業務子域或第三方業務入口。
  4. if ($referer_ok = 0) { return 403; }

    • 一句判斷,業務邏輯非常清晰:
    • <span style="color:red">referer_ok = 0 → 直接拒絕</span>,其他情況放行。
    • 將來要做灰度調試(比如只記錄日誌不攔截),只要把 return 403 換成 access_log 即可,擴展性很好 🚀

五、藍易雲 CDN 場景下的實戰建議

  1. 源站 Nginx 防盜鏈只針對 <span style="color:red">大流量靜態資源目錄</span>,不要對 API、回源健康檢查亂加 referer 限制。
  2. CDN 節點和源站之間,儘量保持 Referer 透傳;如果有自建前置網關,可以統一改成某個內部域名方便區分。
  3. 對於“不帶 Referer 的合法請求”(APP、小程序、命令行工具):

    • 源站規則記得加 none,否則你自己把自己打掛。
    • 重要接口建議額外疊加 <span style="color:red">簽名參數 / Token / 鑑權網關</span>,不要單靠 Referer。
  4. 高併發場景下,如果白名單域名非常多,觀察 Nginx 報警:

    • 如果提示 hash bucket/size 相關告警,再考慮適度調大 referer_hash_max_sizereferer_hash_bucket_size,而不是一上來就亂調。

六、Referer 防盜鏈整體工作流程(Markdown 原理表)

| 步驟 | 環節                         | 關鍵變量/指令                        | 説明與建議 |
| ---- | ---------------------------- | ------------------------------------ | ---------- |
| 1    | 用户發起請求                 | 瀏覽器寫入 Referer                   | 頁面 → 靜態資源時自動附帶,APP/爬蟲可能為空 |
| 2    | 藍易雲 CDN 接收請求          | $http_referer                        | 默認透傳到源站,如需自定義再在 CDN 層改寫 |
| 3    | 源站 Nginx 匹配 location     | location /static/                    | 僅在靜態目錄啓用 referer 策略,避免誤傷接口 |
| 4    | 計算合法性                   | valid_referers / map + $referer_ok   | 統一判定來源是否在白名單範圍內 🔍 |
| 5    | 做出決策                     | if ($invalid_referer) / if ($referer_ok=0) | 403 / 跳轉 / 僅記錄日誌,按業務需求選擇 |
| 6    | 輔助安全                     | 鑑權、簽名 URL、IP 限制等            | Referer 只是一環,重要資源必須疊加其它安全手段 🔒 |

這個表可以直接丟進 Vditor 或任意支持 Markdown 的編輯器裏使用。


七、實話實説:referer 能做什麼,不能做什麼

  • 能做的:

    • 快速擋住大部分“右鍵複製鏈接”“外站直接引用圖片”的低成本盜鏈。
    • 初步篩掉一部分明顯異常來源,為藍易雲的風控、監控打基礎。
    • 配合日誌分析,幫助你看清真實流量來源結構。
  • 不能做的:

    • 無法抵禦有意識的偽造請求(Referer 隨便寫一個白名單域名就能繞過)。
    • 無法替代鑑權系統、簽名 URL、請求限速等真正的安全策略。

所以在藍易雲 CDN 的架構裏,更務實的做法是:

用 <span style="color:red">referer</span> 做“第一道便宜的柵欄”,再用 <span style="color:red">簽名、防刷、限速、WAF</span> 做真正的安全閉環。

如果你把現在的 Nginx 配置貼出來,我可以幫你按“藍易雲標準化模板”的方式,直接重構成一份可上線的 referer 防盜鏈方案 💡

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.