NGINX: Cloudflare의 IP 위치 정보 및 "중첩"if 조건
Cloudflare가 제공하는 다른 기능 중에서 방문자가 온 국가 값이 포함된 특수 헤더를 추가할 수 있습니다.
우크라이나인으로서 러시아에서 오는 모든 방문객을 금지하고 싶지만:
Cloudflare IP 지리적 위치 및 NGINX
여기서 가장 간단한 부분은 Cloudflare의 헤더로 필터를 구성하는 것입니다.
처음에는 CF-IPCountry 헤더를 활성화합니다.
Cloudflare Dashboard > 네트워크로 이동하여 옵션을 활성화하세요. 기본 요금제에서도 무료입니다.
그런 다음 NGINX용 가상 호스트 구성의 서버
{}
블록에서 proxy_set_header
을 사용하여 `$http_cf_ipcountry:
...
proxy_set_header CF-IPCountry $http_cf_ipcountry;
...
NGINX 및 "중첩"인 경우
And the second part is more interesting.
So, we need to check two conditions:
- is a visitor from russia
- is it a common visitor, or a Yandex search bot?
In NGINX we can not use really nested conditions with if
예:
...
if ($country_allowed = no) {
if ($http_user_agent !~* (YandexBot) ) {
rewrite ^ [https://russki-voenny-korabl-idi-nahuy.com](https://russki-voenny-korabl-idi-nahuy.com) break;
}
}
...
But what we can do here, is to use variables and dedicated if
.
점검 해보자.
VPN을 활성화하고 예를 들어 https://www.iplocation.net 서비스를 사용하여 현재 어디에 있는지 확인합니다.
GB — 영국.
nginx.conf
에서 access_log
에 대한 확장 로그 형식을 활성화하여 자세한 정보를 확인하고 아래에서 추가할 $http_cf_ipcountry
및 새 변수$visitor
의 값을 확인할 수 있습니다.
...
log_format main_ext '$time_local client: $remote_addr fwd_for: $http_x_forwarded_for '
'status: $status user_agent: "$http_user_agent" '
'server: "$server_name" country: $http_cf_ipcountry visitor: $visitor';
...
Next, create conditions and run tests. After tests will be successful, we will change conditions to region RU and “if not equal” Yandex (see Yandex robots in server logs).
So:
- create a variable called
$http_cf_ipcountry
헤더에서 CF-IPCountry
; - 첫 번째 ifcondition에서
$http_cf_ipcountry
의 값을 확인합니다. 지금은 GB를 확인하고 지역이 == CA인 경우 값 rus를 유지할 변수$visitor
를 만듭니다. - 두 번째 if 조건에서
User-Agent
를 확인하고 == Firefox인 경우 $visitor
변수에 다른 값을 추가합니다. - "redirect; 세 번째if
조건의 - 은
$visitor
변수의 값을 확인하고 rusredirect 문자열과 같으면 russki-voenny-korabl-idi-nahuy.com 도메인에 다시 씁니다.
또한 rewrite_log
매개변수를 on으로 설정하고 error_log
를 통지 수준으로 설정하여 재작성이 예상대로 작동하는지 확인할 수 있습니다.
이것은 테스트 중에 내 구성이 어떻게 보이는지입니다.
`
...
rewrite_log on;
access_log /var/log/nginx/rtfm.co.ua-access-ext.log main_ext;
error_log /var/log/nginx/rtfm.co.ua-error.log notice;
...
proxy_set_header CF-IPCountry $http_cf_ipcountry;
if ($http_cf_ipcountry = GB) {
set $visitor rus;
}
if ($http_user_agent ~* (Firefox) ) {
set $visitor "${visitor}redirect";
}
if ($visitor = "rusredirect") {
rewrite ^ [https://russki-voenny-korabl-idi-nahuy.com](https://russki-voenny-korabl-idi-nahuy.com) break;
}
...
`
Check the config file and reload nginx
:
root@rtfm-do-production-d10:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@rtfm-do-production-d10:~# systemctl reload nginx
Go to the blog with the Firefox browser:
access_log:
root@rtfm-do-production-d10:~# tail -f /var/log/nginx/rtfm.co.ua-access-ext.log | grep GB
02/Apr/2022:06:22:29 +0000 client: 162.158.91.190 fwd_for: 146.70.46.20,146.70.46.20 status: 302 user_agent: “Mozilla/5.0 (X11; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0” server: “rtfm.co.ua” country: GB visitor: rusredirect
error_log:
root@rtfm-do-production-d10:~# tail -f /var/log/nginx/rtfm.co.ua-error.log | grep ‘rewritten redirect’
2022/04/02 06:22:29 [notice] 21018#21018: *33766595 rewritten redirect: “https://russki-voenny-korabl-idi-nahuy.com", client: 162.158.91.190, server: rtfm.co.ua, request: “GET / HTTP/1.1”, host: “rtfm.co.ua”
Got a visitor from the country: GB
와 user_agent: "Firefox"
, 그리고 redirect: "https://russki-voenny-korabl-idi-nahuy.com"
- "작동합니다!"(씨).
이제 User-Agent
에 대해 RU 지역 및 Yandex가 포함된 최종 버전으로 조건을 변경합니다.
지역 설정: if ($http_cf_ipcountry = RU)
그리고 ~* (Firefox)
를 같지 않은 것으로 변경합니다. 즉, !~* (Yandex) - if ($http_user_agent !~* (Yandex) )`:
...
proxy_set_header CF-IPCountry $http_cf_ipcountry;
if ($http_cf_ipcountry = RU) {
set $visitor rus;
}
if ($http_user_agent !~* (Yandex) ) {
set $visitor "${visitor}redirect";
}
if ($visitor = "rusredirect") {
rewrite_log on;
rewrite ^ [https://russki-voenny-korabl-idi-nahuy.com](https://russki-voenny-korabl-idi-nahuy.com) break;
}
...
완료.
RTFM: Linux, DevOps, and system administration에 원래 게시되었습니다.
Reference
이 문제에 관하여(NGINX: Cloudflare의 IP 위치 정보 및 "중첩"if 조건), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/setevoy/nginx-ip-geolocation-by-cloudflare-and-nested-if-conditions-53dg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)