南昌市网站建设_网站建设公司_页面加载速度_seo优化
2025/12/25 15:03:08 网站建设 项目流程

nginx防盗链

Nginx防盗链原理

防盗链主要通过检查HTTP请求头中的Referer字段来实现。Referer字段记录了请求来源页面的URL。如果Referer字段的值不是本站的URL,或者为空、被伪造等,则可以认为这是一个盗链请求,Nginx可以拒绝提供资源。

nginx防盗链配置

Nginx可以通过以下两种方式实现防盗链功能:

1. 基于Referer的防盗链

Nginx提供了valid_referers指令,用于定义合法的Referer来源。如果请求的Referer不在合法来源列表中,Nginx可以返回403 Forbidden错误,或者重定向到其他页面。

示例配置:

location ~* \.(jpg|jpeg|png|gif)$ {    valid_referers none blocked server_names ~\.google\. ~\.baidu\.;    if ($invalid_referer) {        return 403;        # 或者重定向到其他页面        # return 302 http://example.com/error.jpg;    }}
  • valid_referers指令定义了合法的Referer来源:

  • none:允许没有Referer的请求

  • blocked:允许Referer被防火墙或代理服务器修改的请求

  • server_names:允许来自本服务器域名的请求

  • ~\.google\.:允许来自google.com的请求

  • ~\.baidu\.:允许来自baidu.com的请求

  • $invalid_referer变量表示请求的Referer是否合法。如果Referer不合法,则返回403 Forbidden错误,或者重定向到其他页面。

2. 基于secure_link的防盗链

Nginx的secure_link模块可以生成带有时间戳和签名的URL,确保链接的有效性和时效性。这种方式比基于Referer的防盗链更安全,但需要应用程序生成签名的URL。

示例配置:

location /files/ {    secure_link $arg_md5,$arg_expires;    secure_link_md5 "$secure_link_expires$uri$remote_addr secret";    if ($secure_link = "") {        return 403;    }    if ($secure_link = "0") {        return 410;    }}
  • secure_link指令定义了两个参数:$arg_md5(签名)和$arg_expires(过期时间戳)。

  • secure_link_md5指令定义了生成签名的规则,包括过期时间、URI、客户端IP地址和一个密钥。

  • 如果签名验证失败($secure_link = ""),返回403 Forbidden错误。

  • 如果链接已过期($secure_link = "0"),返回410 Gone错误。

两种方法的比较

方法 优点 缺点 适用场景
基于Referer 配置简单,无需修改应用程序 容易被伪造,安全性较低 简单的防盗链需求
基于secure_link 安全性高,难以伪造 需要应用程序生成签名的URL 对安全性要求高的场景

根据你的具体需求,可以选择合适的防盗链方案。如果只是简单的防盗链需求,基于Referer的方法就足够了。如果对安全性要求较高,建议使用基于secure_link的方法。

Nginx封禁IP

Nginx可以通过以下两种方式实现封禁IP的功能:

1. 使用deny指令封禁IP

Nginx的deny指令可以直接封禁特定的IP地址或IP段。deny指令可以在http、server、location块中使用。

示例配置:

http {deny 192.168.1.1;         # 封禁单个IP地址deny 192.168.1.0/24;      # 封禁IP段allow 192.168.1.100;      # 允许特定IP地址allow all;                # 默认允许所有IP}
  • deny指令 用于封禁指定的IP地址或IP段。

  • allow指令 用于允许指定的IP地址或IP段。

  • 配置的顺序很重要,Nginx会按照从上到下的顺序匹配规则。因此,通常将allow规则放在deny规则之前。

2. 使用ngx_http_geo_module模块封禁IP

Nginx的ngx_http_geo_module模块可以根据IP地址的地理位置来定义变量,从而实现更灵活的IP封禁策略。

示例配置:

http {# 定义IP地址的地理位置geo $blocked_ip {default 0;192.168.1.1 1;192.168.1.0/24 1;}server {# 根据$blocked_ip变量封禁IPif ($blocked_ip) {return 403;}}}
  • geo指令用于定义IP地址的地理位置,并设置相应的变量值。

  • 在server块中,可以根据$blocked_ip变量的值来决定是否封禁IP。

两种方法的比较

方法 优点 缺点 适用场景
使用deny指令 配置简单,直接封禁IP 不灵活,无法根据地理位置封禁 简单的IP封禁需求
使用ngx_http_geo_module模块 灵活,可以根据地理位置封禁 配置复杂,需要定义变量 需要根据地理位置封禁的场景

根据你的具体需求,可以选择合适的IP封禁方案。如果只是简单的IP封禁需求,使用deny指令就足够了。如果需要根据地理位置封禁IP,建议使用ngx_http_geo_module模块。

ngxin

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询