在藍易雲 CDN 這類多節點架構裏,合理利用 Nginx 的 <span style="color:red">referer</span> 能把防盜鏈、流量治理和來源統計捏在一起做好。下面我直接拆開講原理 + 配置方法 + 注意事項,儘量説人話,但技術細節一個都不落下 🙂
一、referer 的本質:瀏覽器帶來的“來源線索”
- 瀏覽器在發起請求時,會把當前頁面地址寫進 HTTP 頭部
<span style="color:red">Referer</span>字段。 - Nginx 會把這個頭映射成變量:<span style="color:red">$http_referer</span>,供後續指令判斷。
-
在 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 中,主要就三件事:
<span style="color:red">valid_referers</span>:定義什麼是“合法來源”。<span style="color:red">$invalid_referer</span>:自動標記當前請求是否是非法來源(1 = 非法,0 = 合法)。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;
}
}
配置逐行解釋
-
location /static/ { ... }- 作用:只對
/static/下的靜態資源(圖片、JS、CSS 等)啓用規則,避免誤傷 API 接口。 - 你也可以改成
/images/、/assets/,按你的目錄規劃來。
- 作用:只對
-
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.com、img.lanyicdn.com。*.example.com:允許你的業務源站或主站域名。
→ 這一行的本質是:<span style="color:red">白名單模式</span>,列出你信任的上游頁面域名。
-
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;
}
# 其他緩存、壓縮配置...
}
}
配置逐行解釋
-
map $http_referer $referer_ok { ... }- 含義:根據請求頭的
<span style="color:red">$http_referer</span>,計算出一個新變量<span style="color:red">$referer_ok</span>。 -
優點:
- 規則集中管理。
- 能寫更復雜的正則匹配。
- 後續
server/location都能複用這一個判定結果。
- 含義:根據請求頭的
-
default 0;- 沒匹配到任何規則 → 默認標記為 0 = 不合法。
- 等價於“黑名單世界中的默認拒絕”。
-
"~*://(www\.)?lanyicdn\.com" 1;等幾行~*:大小寫不敏感正則。://(www\.)?lanyicdn\.com:匹配從http://、https://打開的頁面,域名為lanyicdn.com或www.lanyicdn.com。- 右側
1:只要命中,$referer_ok就置為 1,表示合法。 - 多行規則可以涵蓋不同業務子域或第三方業務入口。
-
if ($referer_ok = 0) { return 403; }- 一句判斷,業務邏輯非常清晰:
- <span style="color:red">referer_ok = 0 → 直接拒絕</span>,其他情況放行。
- 將來要做灰度調試(比如只記錄日誌不攔截),只要把
return 403換成access_log即可,擴展性很好 🚀
五、藍易雲 CDN 場景下的實戰建議
- 源站 Nginx 防盜鏈只針對 <span style="color:red">大流量靜態資源目錄</span>,不要對 API、回源健康檢查亂加 referer 限制。
- CDN 節點和源站之間,儘量保持 Referer 透傳;如果有自建前置網關,可以統一改成某個內部域名方便區分。
-
對於“不帶 Referer 的合法請求”(APP、小程序、命令行工具):
- 源站規則記得加
none,否則你自己把自己打掛。 - 重要接口建議額外疊加 <span style="color:red">簽名參數 / Token / 鑑權網關</span>,不要單靠 Referer。
- 源站規則記得加
-
高併發場景下,如果白名單域名非常多,觀察 Nginx 報警:
- 如果提示 hash bucket/size 相關告警,再考慮適度調大
referer_hash_max_size、referer_hash_bucket_size,而不是一上來就亂調。
- 如果提示 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 防盜鏈方案 💡