防盜鏈核心在於識別 Referer 標頭並拒絕非授權來源。Nginx 提供原生指令與第三方模組兩種實現路徑。
valid_referers 全域/Location 級location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.example.com example.com;
if ($invalid_referer) {
rewrite ^/ https://www.example.com/403.html;
# return 403; # 或直接返回狀態碼
}
}
none:允許無 Referer(直接瀏覽器輸入)blocked:允許防火牆/代理過濾後的 Referer*.example.comlocation /images/ {
alias /data/images/;
valid_referers none blocked server_names *.cdn.example.com;
if ($invalid_referer) {
return 403;
}
}
wget https://github.com/nginx/nginx-accesskey-module/archive/v2.0.3.tar.gz
tar xzf v2.0.3.tar.gz
# 編輯 config 將 $HTTP_ACCESSKEY_MODULE 替換為 ngx_http_accesskey_module
./configure --add-module=../nginx-accesskey-module-2.0.3
make && make install
location /download {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mysecret$remote_addr";
}
<?php
$ipkey = md5("mysecret" . $_SERVER['REMOTE_ADDR']);
$url = "https://cdn.example.com/download/file.zip?key=" . $ipkey;
echo "<a href='$url'>安全下載</a>";
// 原始連結無 key 參數將返回 403
?>
| 方案 | 安全性 | 效能 | 維護性 | 適用場景 |
|---|---|---|---|---|
| valid_referers | 中(Referer 可偽造) | 極高(原生) | 簡單 | 一般圖片/靜態資源防盜鏈 |
| 目錄級 | 中 | 極高 | 簡單 | 特定敏感目錄 |
| AccessKey | 高(簽名含 IP+密鑰+時間) | 中(需計算雜湊) | 需應用層配合 | 付費下載、私有內容、API 防刷 |
limit_req 限制單 IP 請求頻率Referer 白名單,雙層防護accesskey_signature 密鑰