1. 程式人生 > 其它 >通過nginx GeoIP模組 限制某些國家地區訪問網站

通過nginx GeoIP模組 限制某些國家地區訪問網站

通過nginx GeoIP模組來限制某些國家或者具體地區訪問網站,在國內一般用於外貿站,因為很多外貿公司走貨的價格關係,是不希望國內使用者看見的。 除了某些CDN或者付費介面之外,也可以通過本身的伺服器來操作,或者瀏覽器判斷等。 我之前就是用瀏覽器來判斷的,如果瀏覽器的語言是中文ZH,那麼網站就跳轉到不能訪問的地址,這算是一個很粗暴的方法,但是有時候可能又需要使用者稍微變通一下,讓國內使用者可以看見。 那麼這個判斷方法就不是很適合了,萬一遇到某些人不懂瀏覽器的,不會設定語言呢…就麻煩了。 所以可以採用ip判斷的方法,現在用得比較多的應該是MaxMind的免費ip庫,國內大企業付費應該用ipip.net的比較多。 我就只是判斷下國家,所以就用MaxMind的來做判斷。 另外這個方法,不適合用於套CDN的網站,因為CDN是通過cdn的ip在訪問,這個獲取的是cdn的ip。 如果是用於監聽CDN網站,就需要把cdnip被過濾了。 實在是嫌棄麻煩,就直接用一些dns來判斷。

伺服器後端屬於nginx,比較方便。

一、編譯–with-http_geoip_module模組

先看nginx有沒有編譯geoip模組,如果有就直接修改就行,沒有就得先安裝。

nginx -V  #檢視目前的nginx相關配置

1:下載安裝Geoip模組

yum -y install geoip-devel  #CentOS系統

這會自動安裝到/usr/share/GeoIP資料夾下,這個安裝的並不一定是最新的,我們就更新下

mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak   #備份下

cd /usr/share/GeoIP  #進資料夾

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz  #下載最新資料庫

gunzip GeoIP.dat.gz  #解壓出來

2:編譯geoip模組

cd /root/oneinstack/src/nginx-1.12.1  #進入當前nginx資料夾  根據自己目錄來

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.0.2l --with-pcre=../pcre-8.41 --with-pcre-jit --with-ld-opt=-ljemalloc --add-module=../lua-nginx-module --add-module=../ngx_devel_kit --with-http_geoip_module  #新增編譯模組

就是把--with-http_geoip_module加到原來的編譯上去

make && make install  #執行編譯

走完之後,用nginx -V看看裡面有沒有geoip的模組,如果有就是成功了。

二、修改nginx的配置檔案

1:修改nginx.conf的http區域,在裡面加上這段

geoip_country /usr/share/GeoIP/GeoIP.dat;   #GeoIP所在目錄
map $geoip_country_code $allowed_country {  #變數判斷
default yes;   #允許
CN no;  #區域不允許,這個CN就是代表中國,如果是多個地區,就是CN下面加就行
}

具體國家區域可以到官網看:maxmind

還有幾種寫法:

geoip_country GeoIP/GeoIP.dat;

geoip_city GeoIP/GeoLiteCity.dat;

這個是nginx官方貼出來的方法,具體可以到:Nginx官方

2:修改nginx.conf的server區域

location / {
root /data/wwwroot/test;  #網站目錄
if ($allowed_country = no) {  #這裡的no,就是上面html裡面CN on,就是判斷no區域

#if ($allowed_country = no) 也可以用if ($geoip_country_code = CN) 來代替,如果是多個區域就在CN後面幾個|然後加區域程式碼
return 403;   #返回403提示
return http://域名; #跳轉到其他人網站去 ,return也可以用rewrite,具體看自己網站的配置檔案怎麼設定的
root /data/wwwroot/test1;  #跳轉到自己伺服器的另外一個資料夾下面去
}
}

最後nginx -t看看有沒有什麼語法錯誤,沒有就重啟下nginx開啟網站看看,有就自己找原因吧。

nginx Geoip的寫法有很多種,多谷歌看看。

附:

最後也說下瀏覽器語言判斷的,就是下面這段就行了,用javascript加在自己網站的首頁。

if (navigator.language)
var language = navigator.language;
else
var language = navigator.browserLanguage;
if(language.indexOf('zh') > -1)document.location.href = 'cn'; #判斷瀏覽器語言,後面的cn是網站下的耳機目錄,這個隨便自己修改,改成跳轉網址都行