Host

直接访问

浏览器直接访问服务器

结果:浏览器访问IP+端口

img

通过Nginx代理访问(不做任何配置)

通过Nginx反向代理,不配置proxy_set_header。

server {
    listen 8090;
    server_name _;
    location / {
        proxy_pass http://172.31.5.0:5000;
    }
}

img

结果:proxy_pass+代理端口,即代理IP+代理端口。

$host

设置proxy_set_header Host $host (此时代码中如果有重定向路由,那么重定向时就会丢失端口信息,导致 404)

server {
    listen 8090;
    server_name _;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://172.31.5.0:5000;
    }
}

img

结果:浏览器访问IP

h o s t : host: host:proxy_port

设置proxy_set_header Host h o s t : host: host:proxy_port

server {
    listen 8090;
    server_name _;
    location / {
        proxy_set_header Host $host:$proxy_port;
        proxy_pass http://172.31.5.0:5000;
    }
}

img

结果:浏览器访问IP+代理端口

$http_host

设置proxy_set_header Host $http_host

server {
    listen 8090;
    server_name _;
    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://172.31.5.0:5000;
    }
}

img

结果:浏览器访问IP+浏览器访问端口

参考:https://www.cnblogs.com/faberbeta/p/nginx008.html

X-Real-IP

location /mng {
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_pass http://mng;
}

可以通过request.getAttribute(“X-Real-IP”)获取客户端真实IP,但当请求通过多个Nginx代理是,$remote_addr 会被覆盖。

如果请求请过多台Nginx服务器转发,其实$remote_addr就是获取上一台服务器的地址(上一级的IP),X-Real-IP名字可以自定义。

解决覆盖方法:使用X-Forwarded-For $proxy_add_x_forwarded_for

X-Forwarded-For

$http_x_forwarded_for

location /mng {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://mng;
}

Nginx99----------->Nginx100---------->Nginx101----------->服务器
192.168.179.99->192.168.179.100->192.168.179.101->192.168.179.102

102服务器打印日志格式:

log_format  main  '$http_x_forwarded_for|$http_x_real_ip|$remote_addr - $remote_user [$time_local] 					 	"$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

真实数据:

192.168.179.4, 192.168.179.99, 192.168.179.100|-|192.168.179.101 - - [26/Apr/2020:10:57:22 +0800] 		"GET / HTTP/1.0" 
304 0 "-" 
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 			  			Chrome/81.0.4044.122 Safari/537.36" "192.168.179.4, 192.168.179.99, 192.168.179.100";
# client, proxy1, proxy2
$http_x_forwarded_for : 192.168.179.4, 192.168.179.99, 192.168.179.100
$http_x_real_ip|$remote_addr : 192.168.179.101
# 客户端用户名称
$remote_user :  -  
# 访问时间和时区
$time_local : 26/Apr/2020:10:57:22 +0800
# 请求的URI和HTTP协议
$request : GET / HTTP/1.0
# HTTP请求状态
$status : 304
# 发送给客户端文件内容大小
$body_bytes_sent : 0
# 跳转来源
$http_referer : -
# 用户代理:区分设备来源
$http_user_agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36" "192.168.179.4, 192.168.179.99, 192.168.179.100

参考:https://blog.csdn.net/qq_34556414/article/details/78185057

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐