Nginx 阻止某些国家/地区的 POST

Posted

技术标签:

【中文标题】Nginx 阻止某些国家/地区的 POST【英文标题】:Nginx block POST for certain countries 【发布时间】:2013-05-13 00:04:13 【问题描述】:

我有一个反向代理 nginx 到 tomcat。

我的目标是禁止对某些国家/地区的完全访问,并禁止除一个国家/地区以外的所有国家/地区的 POST。

可以通过内核级别的 iptables 实现对某些国家/地区的全面访问禁令。这是一项简单的任务。

我的困境是我如何只禁止来自除一个国家之外的所有国家/地区的 POST。其他人可以看到网站 (GET),但我不希望他们创建帐户或发布数据。

我可以通过列出所有使用 post 的表单来过滤,但是太多了。

有没有办法只用 nginx 过滤帖子?

谢谢

【问题讨论】:

【参考方案1】:
geo $ip_country 
  ranges;
  default zz;
  include /usr/local/nginx/conf/ip_country.conf;


set $method_country $request_method$ip_country;
if ($method_country ~ "POST(?!au)") 
    return 405;

ip_country.conf 格式如:

0.0.0.0-0.255.255.255 eu;
1.0.0.0-1.0.0.255     au;
1.0.1.0-1.0.3.255     cn;
1.0.4.0-1.0.7.255     au;
1.0.8.0-1.0.15.255    cn;
1.0.16.0-1.0.31.255   jp;
1.0.32.0-1.0.63.255   cn;
1.0.64.0-1.0.127.255  jp;
1.0.128.0-1.0.255.255 th;
1.1.0.0-1.1.0.255     cn;
...

您可以在脚本中使用$ip_country 值:

fastcgi_param IP_COUNTRY $ip_country;

【讨论】:

Tnx!今晚我会执行!为此干杯 出于某种原因,nginx 不喜欢你的 if 子句。我用一些非常难看的东西代替:#GEO if ($request_method = POST) set $test P; if ($ip_country != au) 设置 $test "$testC"; if ($test = PC) 返回 405; 对不起,我已经用set $method_country $request_method$ip_country;纠正了这个问题 如果国家/地区名称有多个可能的有效值和/或有效值中有空格,if 行将如何显示? 回答我自己的问题:if ($method_country ~ "POST(?!(ca|us|value with spaces))")

以上是关于Nginx 阻止某些国家/地区的 POST的主要内容,如果未能解决你的问题,请参考以下文章

如何授予对 nGinx 中 GeoIP [国家] 阻止的特定 IP 地址的访问权限?

我如何获得某些国家/地区的城市列表?

如何阻止国家/地区的admob广告

如何阻止国家/地区的 admob 广告

如何阻止某个国家/地区访问我的网站

使用 htaccess 和 GeoIP 阻止特殊地址或 URL 的国家/地区