一、Host为空
1 | # 虚拟主机的主域名 |
1 | # 请求头中'Host'的值 |
1 | # 请求包含'Host'请求头时为'Host'字段的值 |
注:使用$http_host
变量时,在http1.1
协议中,如果请求不带Host
字段值,会报错400
错误
- 客户端必须在所有
HTTP1.1
请求消息中包含Host
头字段 - 如果请求的
URI
不包含所请求服务的主机名,则必须为Host
头字段指定一个空值 HTTP1.1
代理必须确保它转发的任何请求消息,都包含一个适当的主机头字段,用于标识代理请求的服务- 所有基于
HTTP1.1
服务器必须以400
状态代码响应任何缺少主机头字段的HTTP1.1
请求消息
$http_host
1 | $http_host不是一个固定的变量,他其实是$http_HEADER通配后的结果 |
二、Host重复配置
1 | # proxy.conf文件 |
1 | include conf/proxy.conf; # proxy.conf文件中已经设置了Host字段值 |
注:两个proxy_set_header Host $host;
语句,配置在同一个语句块中,不存在子语句块覆盖父语句块的情况
HTTP RFC2616
可以存在具有相同字段名的多个消息头字段在消息中,当且仅当该标头的整个字段值字段被定义为以逗号分隔的列表。通过将每个后续字段值附加到第一个,每个用逗号分隔。因此代理不得改变转发时这些字段值的顺序 。
1 | Cache-Control: no-cache |
由于Host
字段值不允许以逗号分隔,nginx
会报400
状态码错误。
三、$host变量
$host变量的值按照如下优先级获得:
请求行中的
host
1
GET www.test.info/index.php HTTP/1.1
请求头中的
Host
头部,除了端口号的部分与一条请求匹配的server name