2013-05-13 3 views
0

바람둥이에 역 프록시 nginx가 있습니다.특정 국가의 Nginx 블록 POST

내 목표는 특정 국가에 대한 전체 액세스를 금지하고 하나를 제외한 모든 국가에 대해 POST를 금지하는 것입니다.

특정 국가의 경우 총 액세스 금지는 커널 수준에서 iptables를 통해 수행 할 수 있습니다. 그것은 쉬운 작업입니다.

내 딜레마는 하나만 제외하고 모든 국가에서 POST를 금지하는 방법입니다. 나머지는 웹 사이트 (GET)를 볼 수는 있지만 계정을 만들거나 데이터를 게시하는 것을 원하지 않습니다.

게시물을 사용하는 모든 양식을 나열하여 필터링 할 수 있지만 너무 많습니다.

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; 
+0

TNX! 나는 그것을 오늘 밤 구현할 것이다! 그 축하 –

+0

어떤 이유로 nginx는 if 절을 좋아하지 않았습니다. 나는 정말 못생긴 것으로 바뀌었다. #GEO if ($ request_method = POST) { $ test P; } if ($ ip_country! = au) { $ test "$ {test} C"; } if ($ test = PC) { return 405; } –

+0

Sry,'set $ method_country $ request_method $ ip_country; '로 수정했습니다. – Jack