在运行 Ghost 的 nginx 上阻止图片热链接也会破坏有效域上的图片

在运行 Ghost 的 nginx 上阻止图片热链接也会破坏有效域上的图片

我在 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;
}

相关内容