1: 前端获取客户端IP,然后通过请求体等方式传给后端
{
"user_name": "xiaoxiao",
"password": "admin",
"ip": "xx.xx.xx.xx"
}
2: 后端自行获取请求头中IP
# 以django为例
if request.META.get('HTTP_X_FORWARDED_FOR'):
ip = request.META.get('HTTP_X_FORWARDED_FOR')
else:
ip = request.META.get('REMOTE_ADDR')
# 当有多级代理时,HTTP_X_FORWARDED_FOR返回多个IP,取第一个即可。
if ip:
ip = request.split(',')[0]
参数: REMOTE_ADDR
REMOTE_ADDR 是最后向服务器发起请求的IP
参数: HTTP_X_FORWARDED_FOR(需要设置nginx, 否则请求头没有该参数)
此次向服务器发起请求的
01-客户端ip
02-代理ip(但是没有最后1个代理ip, 最后一个代理ip在REMOTE_ADDR中),
使用逗号隔开 例如 "220.xx.xx.xx , 39.xx.xx.xx"
220.xx.xx.xx 是客户端的ip, 39.xx.xx.xx 是第一次代理ip, 第二次代理ip是REMOTE_ADDR 的值
客户端请求---->nginx路由配置(html.conf)----->前端页面----nginx路由配置(django.conf)–>后端接口
nginx配置: 在html.conf中添加
server{
listen 80;
location / {
root /var/www/apps/dist; # 前端静态文件存放地址
error_page 404 /index.html;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With ;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS ;
}
location /api {
proxy_pass 127.0.0.1:8080/; # 指向后台nginx监听django的端口
# 新增三行代码
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3-测试
后台代码
# 任一一个中间件或者接口中添加代码
...
def process_request(self, request):
request_ip1 = request.META.get("HTTP_X_FORWARDED_FOR", "")
request_ip2 = request.META.get("REMOTE_ADDR", "")
with open("header_info.txt", 'a') as f:
f.write('HTTP_X_FORWARDED_FOR: %s, REMOTE_ADDR:%s \r\n' % (request_ip1, request_ip2))
...
...
测试
客户端通过页面正常访问接口:
221 是客户端的ip, 39是代理的ip
postman直接访问django后台
没有代理, 直接拿到221
django项目获取端口号
例: 获取6062
pro_port = request.META['SERVER_PORT']