Nginx 配置之 proxy_set_header

参数 proxy_set_header 是用来设置请求头的,设置了请求头后,后端服务器就可以获取到这些变量值

server {

    listen       80;
    server_name  192.168.1.2;
    
    error_log   /usr/local/etc/nginx/logs/test.error.log;
    access_log  /usr/local/etc/nginx/logs/test.access.log;
    
    location / {
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   Host             $http_host;
        proxy_set_header   X-NginX-Proxy    true;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        add_header Access-Control-Allow-Origin *;
        proxy_pass  http://127.0.0.1:8889;
    }
    
    location /app {
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   Host             $proxy_host;
        proxy_set_header   X-NginX-Proxy    true;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_pass http://192.168.1.3;
    }
}
客户端地址(请求服务的地址): 192.168.1.1
Nignx服务器地址: 192.168.1.2
后端服务器地址: 192.168.1.3

X-Real-IP

客户端的真实 IP,如果设置了 $remote_addr 这个值,后端服务器就能获取到客户端的真实 IP,也就是此例中的 192.168.1.1

Host

host 的值设置为 $proxy_host,是指 proxy_pass 中设置的 host 值,也就是 192.168.1.3,即服务器的 IP 地址。

若客户端发过来的请求 header 中有 host 这个字段, $http_host$host 表示的就是原始请求 host,比如请求的时候 host 的值是 http://test.com,那么反代后还是 http://test.com。

若客户端发过来的请求 header 中没有 host 这个字段,$host 表示 Nginx 代理服务器的地址,即此例中的 192.168.1.2。

$http_host 不是一个固定的变量,它其实是 $http_HEADER 通配后的结果,这里的 HEADER 是一个通配符,通配的是请求头里的 header 属性,例如 $http_content_type 表示请求头里 content-type 属性的值。同理,$http_host 指的就是请求头里的 host 属性。

X-Forwarded-For

这个变量的值有 $proxy_add_x_forwarded_for$remote_addr,在只有一个代理服务器的转发的情况下,两者的效果貌似差不多,都可以真实地显示出客户端的原始 IP。

举例说明,用户 A 的 IP 是 192.168.1.1,请求一个经过两次 Nginx 转发的应用,在第一台 Nginx 中(192.168.1.2),配置如下。

proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

现在 $proxy_add_x_forwarded_for 变量的"X-Forwarded-For"部分是空的,所以只有 $remote_addr,而 $remote_addr 的值是用户的 IP,那么"X-Forwarded-For"变量的值就是用户的 IP:192.168.1.1。

到第二台 Nginx,配置如下。

proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

现在的 $proxy_add_x_forwarded_for 变量,“X-Forwarded-For"部分包含的是用户的真实 IP, $remote_addr 部分的值是上一台 Nginx 的 IP 地址,那么"X-Forwarded-For"的值就变成了"用户的真实 IP,第一台 Nginx 的 IP”,也就是"192.168.1.1, 192.168.1.2"。

所以建议"X-Forwarded-For"的值设置成 $proxy_add_x_forwarded_for

参考资料

  • 知乎

你可能感兴趣的:(杂论,nginx)