Nginx如何实现防盗链?

Nginx可以通过valid_referers模块实现防盗链功能。防盗链是一种黑客技术,通过隐藏真实的HTTP Referer字段值来盗取网站资源。valid_referers模块允许我们验证Referer字段,拒绝不在许可列表中的请求,以防止资源被盗链。

valid_referers语法:

valid_referers none | server_names | string …;

  • none:允许任何referer
  • server_names:允许自己网站的referer,使用该网站的server_name配置
  • string:指定允许的referer内容

配置示例:

location ~* \.(gif|jpg|png)$ {
    valid_referers none blocked www.example.com; # 允许example.com的referer
    if ($invalid_referer) {
       return 403;
    }
}

上例匹配gif、jpg、png资源,并开启valid_referers验证。 none表示允许空referer,blocked拒绝所有referer。所以该location只允许www.example.com域名的referer,其他referer请求返回403错误。

防盗链的工作原理:

  1. 客户端发送请求,请求头包含Referer字段,标识请求来源页面的URL。
  2. Nginx接收到请求,如果location开启valid_referers模块,会检查Referer字段。
  3. 如果Referer字段的值在valid_referers列表中,请求正常响应。
  4. 如果Referer字段的值不在列表中或为空,变量$invalid_referer值为1,执行if块内重定向或返回错误页面。
  5. 所以通过验证Referer来源,可以有效阻止盗链请求,保护网站资源安全。