Nginx中关于proxy_set_header字段的解释

主要涉及Nginx转发请求时对请求头内容的更改

在反向代理时,配置文件中经常要用到proxy_set_header,这条指令适用于设置向反代的后端服务器重新设置发送给代理服务器的http请求头,例如:

location / {
        proxy_pass http://127.0.0.1:8000/;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
}

Host


指的是Nginx向后端服务器发送的请求头中的HOST字段

  • $proxy_host

默认值为$proxy_host,表示的是反代目标的后端服务器的域名或IP,上面的例子指的是127.0.0.1:8000

$http_host$host,表示的Nginx代理服务器的地址但又有所不同

  • $host

当发送来的HTTP请求中不存在HOST字段,或者HOST字段的值为空,那么$host就等于server_name(在当前Nginx配置中定义的)

当发送来的HTTP请求中HOST字段的值存在,那么$host等于HOST字段的值中除去端口好的部分

也就是说,不管HOST字段为xxx.xxx.com还是xxx.xxx.com:8080$host都等于xxx.xxx.com

  • $http_host

这个变量实际上是被定义为$http_HEADER,其中HEADER可以更改为HTTP请求头中的任意字段,并用来获得这个字段的值

所以$http_host也就是将HEADER改为host,它会直接去匹配HTTP请求中HOST字段的值,如果有的话就获得这个值,如果没有就留空(这个地方就是和$host之间的差异)

X-Real-IP


指客户端的真实IP,设置$remote_addr表示客户端的真实IP,这样后端服务器知道真实的客户端是谁。

另外,X-Real-IP 是一个非标准的HTTP头,如果不设置,此头不会被自动添加

X-Forwarded-For


X-Forwarded-For同样是一个非标准的HTTP头,如果没有明确设置,它也不会被自动添加到请求中

这个变量的值可以设置为$proxy_add_x_forwarded_for,用于在现有的X-Forwarded-For请求头内容中添加当前客户端的IP地址,也就是说X-Forwarded-For这个头部值记录了经过多个反向代理的HTTP请求的客户端IP地址链

如果说一个HTTP请求经过了多个反代服务器,并且每个反代服务器都将X-Forwarded-For设置为$proxy_add_x_forwarded_for,那么X-Forwarded-For这个头部内容将会记录从原始客户端到每一层反代服务器的所有IP地址

X-Forwarded-Proto


X-Forwarded-Proto 通常用于指示原始请求使用的协议(HTTPHTTPS)。这个头部在默认情况下不会添加,可以通过 proxy_set_header X-Forwarded-Proto $scheme; 显式设置

Upgrade & Connection (升级WebSocket)


Upgrade和Connection是两个特殊的请求头部,通常一起使用,这两个头部字段通常用在协议升级的场景中,例如从HTTP升级至WebSocket

具体使用如下:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
发表了43篇文章 · 总计78.96k字
·
Built with Hugo
主题 StackJimmy 设计