使用 cloudflare 预防 nginx 热链接

使用 cloudflare 预防 nginx 热链接

我想阻止我的网站上出现热链接。

但是我也使用 cloudflare 来为我的网站提供服务。我不想使用 cloudflare 防盗链功能,因为它无法排除我允许图像链接的外部域(以及将图像重定向到防盗链的图像)。因此我想在我的服务器级别阻止盗链。

问题是当我在服务器上启用它时,cloudflare 会重定向到被拒绝热链接的图像,无论域名是什么,包括我自己的域名。这是我使用的代码:

location ~* \.(gif|png|jpe?g)$ {

  # prevent hotlink
  valid_referers none blocked ~.google. ~.bing. ~.yahoo. allowed-domain.com, server_names ~($host);
  if ($invalid_referer) {
    rewrite (.*) /static/images/hotlink-denied.jpg redirect;
    # drop the 'redirect' flag for redirect without URL change (internal rewrite)
  }
}

location = /static/images/hotlink-denied.jpg { }

有没有什么方法可以绕过图像上的 cloudflare?

答案1

图像是您希望通过 CDN 提供的关键静态资源。这可以减少服务器负载,让您的网站更快地为访问者加载。不过,这可能不适合某些用例。

我使用 CloudFlare 进行防盗链保护。和您一样,当我关闭它时,Nginx 防盗链保护不起作用。我的配置与您的非常相似。

启用热链接的最佳方法是遵循CloudFlare 说明如果您想启用热链接。

目前,您可以通过在 URL 中使用“hotlink-ok”参数来指定允许热链接的某些 URL。例如,您可以设置一个名为“hotlink-ok”的目录,并将您想要热链接的图像放入其中。例如:

http://www.yoursite.com/images/hotlink-ok/someimage.jpg

选项二

下一个选项是创建一个子域名,将其托管在 CloudFlare 下,但关闭 Hotlink 保护。目前,这是在控制面板最右侧的“内容保护”选项卡中完成的。

这里有两个子选项

  • 使用 CloudFlare CDN 托管和提供图片(橙色云开启)。这可以减少服务器负载和带宽,但使任何人都可以使用图片。
  • 关闭缓存(灰色云),这样 CloudFlare 就只是充当 DNS 服务器。使用 Nginx 进行热链接保护,就像您目前所做的那样。

我的 Nginx 配置

这是我的 Nginx 配置,与您的一样,它无法通过 CloudFlare 工作。

# Cache images on the client. Don't log errors or access. Block hotlinking.
location ~*  \.(jpg|jpeg|png|gif|css|js|ico|woff|woff2)$ {
  valid_referers none blocked server_names ~($host) ~(googleusercontent|google|bing|yahoo);
  if ($invalid_referer) {
    rewrite (.*) /stop-stealing-images.png redirect;
    # drop the 'redirect' flag for redirect without URL change (internal rewrite)
  }

  # Set up caching - 8 days for static resources. Remove the old unnecessary Pragma and hide the server version
  add_header Cache-Control "public, max-age=691200, s-maxage=691200";
  more_clear_headers Server; more_clear_headers "Pragma"; more_clear_headers "Expires";
}

# This allows the "stop stealing images" image to be hotlinked
location = /stop-stealing-images.png { }

答案2

总结

您可以在 cloudflare 中为不应被热链接的图像创建页面规则:

Url matches: https://example.com/images/*
The setting: Cache Level: Bypass

现在,所有请求都会不经缓存地进入您的服务器,并且热链接也会被您的服务器阻止。

长答案:

如果您不禁用缓存,那么 cloudflare 会将您成功链接的图像添加到他们的 CDN,并且任何额外的热链接请求都会成功,因为该请求永远不会进入您的服务器,所以无法被阻止。

笔记:cloudflare 热链接保护(Scrape Shield)目前仅适用于 gif、ico、jpg、jpeg 和 png,不适用于 svg。

答案3

检查日志中 cloudflare 的 referer 字符串与您包含的内容。如果不存在,您只需将其包含在有效 referers 行中,它应该可以正常工作。:)

相关内容