如何使用 Nginx Referer 白名單設定防止盜鏈

透過在 Nginx 中防止盜鏈,你可以保護站點的圖片和媒體檔案不被未授權使用。valid_referers 指令可以讓你控制哪些網站可以存取你的資源。如果有人從未授權站點盜鏈你的檔案,Nginx 會回傳 403 forbidden 錯誤。這種方式可以幫助你節省頻寬並保護內容安全,對香港伺服器租用環境尤為重要。許多站點擁有者都依賴 valid_referers 來管理存取並阻止不需要的請求。
重點速覽
- 盜鏈會在未獲許可的情況下占用你的伺服器資源,造成頻寬被盜用與成本上升。
- 在 Nginx 中設定 referer 白名單,可以控制哪些網站能存取你的圖片和媒體檔案。
- 測試 Nginx 設定,確保它能夠阻止未授權請求,並允許可信網域存取。
- 定期檢視與更新你的白名單,以保持盜鏈防護的有效性。
- 可以結合圖片浮水印、CDN 等額外手段,進一步強化防盜鏈保護。
為什麼要防止盜鏈
什麼是盜鏈
你可能在某些網站上看到圖片或影片實際上來自另一個網站。這種做法就叫做盜鏈。當某個網站直接連結到你伺服器上託管的圖片或影片等檔案時,它會在未經你允許的情況下使用你的資源。盜鏈也稱為內嵌連結(inline linking)。對方不儲存或上傳內容,而是直接指向你的檔案。這會導致你的頻寬被過度占用,即使內容顯示在別人的網站上。許多人認為盜鏈是不道德的行為,因為它在未經允許的情況下使用了他人的資源。
盜鏈帶來的風險
如果你不採取措施防止盜鏈,你的網站可能會面臨多種問題:
- 頻寬被盜用:盜鏈會消耗你的伺服器頻寬。例如,一張 250KB 的圖片每天被存取 2,000 次,一個月就可能消耗高達 15GB 的頻寬。頻寬消耗會迅速累積,導致更高的伺服器費用。
- 效能受影響:當未授權網站大量使用你的檔案時,你自己的網站可能會變慢。請求數量增加會影響訪客體驗,甚至降低搜尋引擎排名。
- 內容控制權喪失:你會失去對內容顯示位置與顯示方式的控制。如果你修改或刪除檔案,被盜鏈的內容可能會失效或顯示過期資訊。
- 法律與道德問題:盜鏈可能違反著作權法律。
盜鏈在法律層面存在風險,尤其涉及著作權侵權。未經允許使用他人資源,可能侵犯法律上的智慧財產權,讓實施盜鏈的網站面臨法律後果。
- 安全風險:當其他網站依賴你的檔案時,你可能會暴露敏感資訊,或成為攻擊目標。
- 連結腐爛(Link Rot):如果你刪除或移動檔案,被盜鏈的內容就會消失,在其他網站上留下破圖或失效的影片連結。
現在,許多虛擬主機與伺服器租用供應商都將防盜鏈作為標準功能。例如:
| 服務商 | 盜鏈策略 |
|---|---|
| AwardSpace | 對所有免費共享帳戶預設啟用防盜鏈保護,阻止瀏覽器直接存取圖片檔案,以保護頻寬。 |
你可以透過設定伺服器、使用 CDN、給圖片加上浮水印等方式來防止盜鏈。這些步驟有助於保護你的資源,並讓網站保持穩定運作。
如何在 Nginx 上阻止盜鏈
Nginx Referer 白名單說明
你可以透過使用 referer 白名單在 Nginx 上阻止盜鏈。這種方法能讓你決定哪些網站可以載入你的圖片或媒體檔案。Referer 白名單透過檢查每個請求裡的 referer 標頭來運作。如果 referer 標頭符合白名單中的網域,Nginx 就允許該請求;否則,Nginx 會加以阻止。
valid_referers 指令是完成這項工作的核心工具。你使用它來設定允許的 referer 清單。valid_referers 指令的作用包括:
- 指定 referer 標頭允許的取值。
- 依據請求來源控制對資源的存取。
- 決定是否允許或阻止請求,取決於 referer 是否有效。
當你設定了 referer 白名單,就能防止頻寬被盜用,並對內容維持控制權。你可以使用萬用字元來涵蓋所有子網域,也可以逐一列出允許存取的網域。例如,*.example.com 可以允許 blog.example.com、shop.example.com 等所有子網域。
Referer 標頭在防盜鏈中非常關鍵。如果請求攜帶的 referer 不在白名單中,Nginx 就會阻止該請求。如果 referer 標頭缺失或看起來可疑,Nginx 也可以拒絕請求,從而提供更強的盜鏈防護。
設定範例
你可以透過編輯 Nginx 設定檔來配置防盜鏈。下面是一個使用 referer 白名單的範例設定:
server { listen 80; server_name cdn.example.com; location /images/ { # Block hotlinking from other sites valid_referers none blocked server_names *.example.com example.com; if ($invalid_referer) { return 403; } alias /var/www/images/; } }
我們來分解一下這個設定的關鍵部分:
server區塊用來監聽發往cdn.example.com的請求。location /images/區塊將規則套用到該目錄下的所有圖片。valid_referers指令用來設定白名單。它允許沒有 referer 標頭、被標記為 blocked 的 referer 標頭,或與目前伺服器名稱、任意example.com子網域以及example.com本身相符的 referer。if ($invalid_referer)區塊用來檢查 referer 是否無效。如果無效,Nginx 會回傳 403 forbidden 錯誤。alias指令告訴 Nginx 要到伺服器上的哪個目錄去尋找圖片。
你可以在 valid_referers 指令中使用萬用字元。例如,*.example.com 可以匹配 blog.example.com、shop.example.com 等所有子網域。如果你需要允許多個站點,可以將多個網域依序列出。
如果你想在 Nginx 中阻止盜鏈,但不想回傳 403 forbidden,而是顯示一張自訂圖片,也可以修改回應結果。例如,你可以重新導向到一張占位圖片,示例如下:
if ($invalid_referer) {
return 302 /images/placeholder.jpg;
}
這一行告訴 Nginx:如果有人嘗試盜鏈你的檔案,就把對方重新導向到占位圖片。
防盜鏈策略在經過測試後效果最佳。請確保你的 referer 白名單中只包含可信網域。你還可以把這種方法與其他工具結合使用,例如安全簽章(token)或 .htaccess 防盜鏈(在 Apache 上),以獲得更高的安全性。
Referer 標頭是阻止不必要請求的關鍵。透過在站點設定中加入嚴謹的白名單,你可以有效防止盜鏈,保護自己的資源。如果你遵循以上步驟,就能在 Nginx 上建置一套穩固的防盜鏈方案。
實作並測試你的 Nginx 設定
編輯並重新載入 Nginx 設定
你需要更新 Nginx 設定檔來啟用防盜鏈。首先,使用文字編輯器開啟 Nginx 設定檔,例如 nano 或 vim。在終端機中執行以下指令:
sudo nano /etc/nginx/sites-available/default
找到你希望啟用防盜鏈的設定區域,並依照前面的範例加入 referer 白名單規則。編輯完成後儲存檔案。
接下來,檢查設定是否有語法錯誤,執行:
sudo nginx -t
如果看到成功的提示訊息,就可以重新載入 Nginx 以套用新設定:
sudo systemctl reload nginx
現在你的伺服器已經更新完成。Nginx 會開始阻止不符合 referer 白名單的請求。如果設定有誤,Nginx 會輸出錯誤訊息。因此在重新載入之前,一定要先測試設定。
提示:在修改 Nginx 設定之前,務必要先備份設定檔。如果出現問題,你可以輕鬆還原原本的設定。
測試允許與被阻止的網域
測試非常重要,它可以確認你的防盜鏈設定是否生效。你需要確保 Nginx 能夠允許來自可信網域的請求,並對其他請求回傳 403 forbidden 錯誤。
可以依照以下步驟進行測試:
- 在瀏覽器中直接存取來自你自己網域的圖片或媒體檔案,確認檔案能正常載入。
- 嘗試從另一個網域存取同一個檔案,或透過沒有 referer 的直接連結存取。此時 Nginx 應該回傳 403 forbidden 錯誤。
- 使用線上工具或瀏覽器擴充功能偽造或修改 referer 標頭,分別用允許與不允許的值進行測試。
- 檢查 Nginx 日誌中的 403 forbidden 記錄,確認 Nginx 正在阻止不需要的請求。
如果本應允許的存取也回傳 403 forbidden,請重新檢查白名單,確保已包含所有可信網域。如果發現 Nginx 仍然允許不在白名單中的站點盜鏈,則需要仔細核對 referer 規則。
注意:某些瀏覽器或工具並不一定會送出 referer 標頭。你可以根據實際需求調整規則,以處理缺失或被清除的 referer。
透過測試你的設定,可以確保防盜鏈策略有效保護了你的資源。每次更新 Nginx 設定後,都可以重複這些步驟進行驗證。
排查防盜鏈設定問題
常見設定錯誤
在 Nginx 中設定防盜鏈時,你可能會遇到一些常見問題,這些問題會導致規則未如預期生效。下面的表格列出了最常見的設定錯誤及其說明:
| 設定問題 | 說明 |
|---|---|
| Referer 設定不正確 | 如果 referer 選項設定有誤,其他站點仍然可能存取你的圖片。 |
| 與 Cloudflare 的相容性 | 將 Cloudflare 與 Nginx 一起使用時,可能導致防盜鏈規則失效或行為異常。 |
| 處理空 referer 的方式 | 如果忽略空 referer,使用者可以直接存取圖片,這會削弱防盜鏈效果。 |
你可以透過以下步驟診斷與修復這些問題:
- 檢查 Web 應用程式防火牆(WAF)日誌,查看被攔截的請求。
- 檢視你的防火牆規則,例如基於 IP 或地區的過濾策略。
- 確認檔案權限是否正確:檔案使用 644,目錄使用 755。
- 檢查身分驗證設定是否影響存取。
- 重新檢視 Nginx 中的防盜鏈(hotlinking)規則是否書寫正確。
- 使用
curl或wget等工具測試,查看原始回應標頭是否符合預期。
只要依照這些步驟排查,大多數導致防盜鏈失敗的問題都能被及時發現與解決。
處理缺失或偽造的 Referer
有時,請求可能不帶 referer 標頭,或者 referer 被偽造。這可能因多種原因造成:
- 伺服器設定錯誤會導致 referer 缺失或被竄改。
- 某些 Referrer Policy 會主動移除 referer 標頭。
- 從 HTTPS 重新導向到 HTTP 時,referer 通常會被丟棄。
- 在
valid_referers中允許none,可能會讓不希望的請求繞過防護。
你可以透過調整 Nginx 設定來處理這些情況。valid_referers 指令允許你控制 Nginx 如何對待缺失或可疑的 referer。如果設定得當,可以阻止大多數試圖透過偽造 referer 來繞過防盜鏈的行為。但要謹慎設定,因為不安全的配置會讓攻擊者更容易偽造 referer 並存取你的檔案。
提示:每次修改防盜鏈設定後,都要進行測試。使用不同瀏覽器和工具,檢查規則是否正確攔截不需要的請求,同時允許可信存取。
你可以透過在 Nginx 中執行幾個清楚的步驟來防止盜鏈。下面的表格總結了主要操作:
| 步驟 | 說明 |
|---|---|
| 1 | 修改 Nginx 設定檔,為圖片類型檔案新增一個 location 區塊。 |
| 2 | 在設定中指定有效的 referer,只允許來自你自己網域及其他授權網域的存取。 |
| 3 | 為無效 referer 設定回應結果,例如回傳 “403: Access Denied” 錯誤。 |
透過這種方式,可以保護你的資源並節省頻寬。你還可以結合圖片浮水印、伺服器冗餘架構或內容傳遞網路(CDN)等進階方案,進一步強化防盜鏈保護。定期測試有助於維持設定的有效性與安全性。
常見問答(FAQ)
如何在 Nginx referer 白名單中允許多個網域?
你可以在 valid_referers 指令中依序列出多個網域。例如:
valid_referers example.com *.example.com trustedsite.com;
這類設定可以同時允許主站、所有子網域以及另一個可信網域存取。
如果瀏覽器不送出 referer 標頭會怎樣?
Nginx 會依照你的設定來處理沒有 referer 的請求。如果在 valid_referers 中包含 none,Nginx 就會允許這些請求;如果未包含,Nginx 會將它們視為無效並加以阻止。
使用者是否可以透過修改 referer 繞過防盜鏈?
某些使用者可以嘗試偽造 referer 標頭。Nginx 會檢查該標頭,但無法阻止所有進階偽造行為。你可以透過使用簽章 URL 或存取權杖等方式,增加額外的安全層級。
防盜鏈會影響搜尋引擎嗎?
大多數搜尋引擎不會盜鏈圖片。如果你阻擋空 referer,一些爬蟲可能無法存取你的檔案。必要時,你可以將搜尋引擎的網域加入白名單。
我可以在哪裡查看被阻止的請求?
你可以在 Nginx 存取日誌中查看狀態碼為 403 的記錄,例如:
"GET /images/photo.jpg" 403
這條記錄表示 Nginx 已經根據防盜鏈規則阻止了該請求。
