源站屏蔽其他ip后设置获取访问者真实IP冲突怎么办?

441 次浏览次阅读
没有评论

源站为安全着想屏蔽除反代的其他 ip 后,再在nginx里设置添加获取访问者真实 IP 的代码,会发生冲突导致网站无法访问咋解决?

源站屏蔽其他ip后设置获取访问者真实IP冲突怎么办?

比如 设置了 location / { try_files $uri $uri/ /index.php?$args;

allow XXX;

deny all;

}

然后 nginx 里又设置了

set_real_ip_from 0.0.0.0/0;

real_ip_header X-Forwarded-For;

real_ip_recursive on;

就会导致网站 404 ,必须把前面的 allow XXX;deny all;删掉才行

造成原因

这个问题是由于设置了源站屏蔽除反代之外的其他IP后,与设置获取访问者真实IP的代码冲突所导致的。

当设置了allow XXX; deny all;时,它会拦截所有请求并仅允许来自IP地址为XXX的请求通过。而同时又设置了set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; real_ip_recursive on;来获取访问者真实IP地址。

由于allow XXX; deny all;拦截了所有请求,所以无论设置获取真实IP的代码如何,都不能访问网站,出现404错误。

解决方法

要解决这个问题,可以尝试以下方法:

  1. 将 allow XXX; deny all; 放在 location 块中的 set_real_ip_from 和 real_ip_header 之前,确保阻止访问的规则在设置获取真实 IP 的规则之前生效。例如:
location / {
    allow XXX;
    deny all;
    
    set_real_ip_from 0.0.0.0/0;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    
    try_files $uri $uri/ /index.php?$args;
}
  1. 如果第一种方法不起作用,可以使用 if 指令来分别处理符合条件和不符合条件的请求。例如:
location / {
    set_real_ip_from 0.0.0.0/0;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    
    if ($remote_addr != X.X.X.X) {
        return 403;
    }
    
    try_files $uri $uri/ /index.php?$args;
}

请注意,使用 if 指令可能会引起其他问题,因为它在一些情况下不会按预期工作。因此,最好使用第一种方法来解决问题。

正文完
 
评论(没有评论)