使用Nginx自帶模塊realip獲取用戶IP地址
yum或者apt安裝的都會默認有這個模塊
真實服務器nginx配置
server { listen 80; server_name www.qq.com; access_log /data/logs/nginx/www.qq.com.access.log main; index index.php index.html index.html; root /data/site/www.qq.com; location / { root /data/site/www.qq.com; } location = /getRealip.php { set_real_ip_from 192.168.50.0/24; set_real_ip_from 61.22.22.22; set_real_ip_from 121.207.33.33; set_real_ip_from 127.0.0.1; real_ip_header X-Forwarded-For; real_ip_recursive on; fastcgi_pass unix:/var/run/phpfpm.sock; fastcgi_index index.php; include fastcgi.conf; } }
getRealip.php內容
<?php $ip = $_SERVER['REMOTE_ADDR']; echo $ip; ?>
訪問www.qq.com/getRealip.php,返回:
120.22.11.11
如果注釋 real_ip_recursive on或者 real_ip_recursive off
訪問www.qq.com/getRealip.php,返回:
121.207.33.33
很不幸,獲取到了中繼的IP,real_ip_recursive的效果看明白了吧.
- set_real_ip_from:真實服務器上一級代理的IP地址或者IP段,可以寫多行
- real_ip_header:從哪個header頭檢索出要的IP地址
- real_ip_recursive:遞歸排除IP地址,ip串從右到左開始排除set_real_ip_from里面出現的IP,如果出現了未出現這些ip段的IP,那么這個IP將被認為是用戶的IP。例如我這邊的例子,真實服務器獲取到的IP地址串如下:
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
在real_ip_recursive on的情況下
61.22.22.22,121.207.33.33,192.168.50.121都出現在set_real_ip_from中,僅僅120.22.11.11沒出現,那么他就被認為是用戶的ip地址,并且賦值到remote_addr變量
在real_ip_recursive off或者不設置的情況下
192.168.50.121出現在set_real_ip_from中,排除掉,接下來的ip地址便認為是用戶的ip地址
如果僅僅如下配置:
set_real_ip_from 192.168.50.0/24; set_real_ip_from 127.0.0.1; real_ip_header X-Forwarded-For; real_ip_recursive on;
訪問結果如下:
121.207.33.33
總結:real_ip_recursive on 這個參數一定要打開才能獲取到真實用戶ip