![在运行 Ghost 的 nginx 上阻止图片热链接也会破坏有效域上的图片](https://linux22.com/image/758551/%E5%9C%A8%E8%BF%90%E8%A1%8C%20Ghost%20%E7%9A%84%20nginx%20%E4%B8%8A%E9%98%BB%E6%AD%A2%E5%9B%BE%E7%89%87%E7%83%AD%E9%93%BE%E6%8E%A5%E4%B9%9F%E4%BC%9A%E7%A0%B4%E5%9D%8F%E6%9C%89%E6%95%88%E5%9F%9F%E4%B8%8A%E7%9A%84%E5%9B%BE%E7%89%87.png)
我在 nginx 1.14.0 和 Ubuntu 18.04 上运行 Ghost。我正在尝试阻止外部网站的图像热链接。
我已经添加了推荐的代码这个帖子(从位置 ~* .(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 错误的外部请求。然而,它也会破坏图像的本地显示,尽管 referer 似乎来自https://example.com当我使用 Firefox 中的网络检查器检查请求时,域。
我尝试在 valid_referers 行中添加不同的服务器:localhost、127.0.0.1、服务器的 ip,https://example.com/*,http://example.com/*。然而,无论我如何配置 valid_referers 行,尝试从本地站点加载图像时仍然会被阻止。
当我删除整个热链接阻止块时,一切都可以在本地正常运行,并且图像能够被热链接。
有什么想法吗?这让我抓狂不已。提前致谢。
答案1
通过添加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;
}