使用nginx代理后,获取用户真实ip
使用nginx转发请求时,应用中获取到的用户ip 都是127.18.0.1
,获取真实ip必须重写一些头部才行。
网上大多数的解决方案是:
nginx设置如下:
server {
listen 80;
server_name _;
location / {
..................
proxy_pass http://127.0.0.1:8000;
# $host 变量,Host 为变量名
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HTTP-X-Forwarded-For $remote_addr;
}
}
然后代码打印用户真实IP(Python代码):
logger = logging.getLogger('ipandpath')
# 日志消息
remote_info = ''
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
remote_info = ' HTTP_X_FORWARDED_FOR:' + x_forwarded_for.split(',')[0]
else:
remote_addr = request.META.get('REMOTE_ADDR')
remote_info += ' REMOTE_ADDR:' + remote_addr
token = request.META.get('HTTP_TOKEN')
user_agent = request.META.get('HTTP_USER_AGENT')
logger.info( remote_info + ' URL:' + request.path + ' METHOD:' + request.method +
' TOKEN:' + token + ' USER_AGENT:' + user_agent)
**然后重启Nginx,发现打印的IP信息还是没有更改。**因为Nginx配置错误
因为Nginx正确配置如下:
server {
listen 80;
server_name _;
location / {
..................
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
然后重启Nginx服务。
实测以下配置无效:
proxy_set_header HTTP-X-Forwarded-For $remote_addr;
为什么?
因为你设置header的时候,浏览器会自动把小写变成大写,并且加上HTTP头信息,-
变成_
。
所以 设置成X-Forwarded-For
然后用 request.META.get('HTTP_X_FORWARDED_FOR')
获取用户的真实IP。