在反向代理时,配置文件中经常要用到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
通常用于指示原始请求使用的协议(HTTP
或 HTTPS
)。这个头部在默认情况下不会添加,可以通过 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";