Nginx

在執行 Ghost 的 nginx 上阻止圖像熱連結也會破壞有效域上的圖像

  • October 10, 2020

我在 nginx 1.14.0 和 Ubuntu 18.04 上執行 Ghost。我正在嘗試阻止外部站點的圖像盜鏈。

我已經從這篇文章中添加了推薦的程式碼(以 location ~* .(gif|png|jpe?g)$ 開頭)以防止圖像盜鏈。

這是我的站點配置文件:

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;

server_name example.com;
root /var/www/example.com/system/nginx-root; # Used for acme.sh SSL verification (https://acme.sh)

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;

location / {
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header Host $http_host;
   proxy_pass http://127.0.0.1:2368;
}

location ~* \.(gif|png|jpe?g)$ {
   valid_referers none blocked example.com *.example.com;
   if ($invalid_referer) {
       return 403;
   }
}

location ~ /.well-known {
   allow all;
}

client_max_body_size 50m;}

問題是當我添加此程式碼塊並重新啟動 nginx 時,它可以正常工作並阻止返回 403 Forbidden 錯誤的外部請求。但是,當我在 Firefox 中使用網路檢查器檢查請求時,儘管引用者似乎來自https://example.com域,但它也會破壞圖像的本地顯示。

我嘗試將不同的伺服器添加到 valid_referers 行:localhost、127.0.0.1、伺服器的 ip、https : //example.com/*、http: //example.com/*。然而,無論我如何配置 valid_referers 行,當嘗試從本地站點載入圖像時,圖像仍然被阻止。

當我刪除整個熱連結阻止塊時,本地一切正常,並且圖像能夠被熱連結。

有任何想法嗎?這讓我快瘋了。提前致謝。

通過添加location ~* \.(gif|png|jpe?g)$塊,這些 URI 不會被location /塊處理。查看Nginx 如何處理請求

您需要使proxy_xxx語句可用於新塊。proxy_set_header語句可以被繼承。

例如:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;

location / {
   proxy_pass http://127.0.0.1:2368;
}

location ~* \.(gif|png|jpe?g)$ {
   valid_referers none blocked example.com *.example.com;
   if ($invalid_referer) {
       return 403;
   }
   proxy_pass http://127.0.0.1:2368;
}

引用自:https://serverfault.com/questions/1037124