在Nginx中,变量$host和$http_host之间有什么区别?
$host
$http_host
1yjd4xko1#
$host是核心模块的变量。$主机此变量等于请求标头中的行Host,如果Host标头不可用,则等于处理请求的服务器的名称。在以下情况下,此变量的值可能与$http_host的值不同:1)当主机输入头不存在或具有空值时,$host等于server_name指令的值; 2)当Host的值包含端口号时,$host不包含该端口号。$host的值从0.8.17开始始终为小写。$http_host也是同一个模块的变量,但是你不会找到它的名字,因为它一般被定义为$http_HEADER(ref)。$http_标题HTTP请求标头HEADER的值(转换为小写,并且“破折号”转换为“下划线”),例如$http_user_agent、$http_referer...;总结:
$http_HEADER
HTTP_HOST
server_name
ssm49v7z2#
已接受的答案及其注解似乎(不再)正确。按照以下优先顺序:请求行中的主机名,或“Host”请求头字段中的主机名,或与请求匹配的服务器名因此$http_host始终是Host标头字段的值。如果请求行中的主机(如果指定)与Host标头字段不同,或者Host标头未设置,则它们可能不同。server_name仅与Host报头字段(http://nginx.org/en/docs/http/request_processing.html)匹配,因此$host可能不同于匹配的server_name。
Host
7hiiyaii3#
$http_host始终等于Host请求报头字段
Host: example.org
$host的优先级顺序如下(从高到低):
GET http://example.org/test/ HTTP/1.1
server_name *.example.org;
当打开URL http://example.org/test/时...大多数浏览器都是这样发送请求的
http://example.org/test/
GET /test/ HTTP/1.1 Host: example.org
大多数浏览器不会这样发送请求(但这是有效请求)
server { listen 80; server_name *.example.org; location / { default_type "text/plain"; return 200 "[host] = $host"; } }
$host =来自请求行的主机名
curl http://127.0.0.1 -v \ --request-target http://request.example.org/test/ \ --path-as-is \ -H "Host: host.example.org"
此命令将
127.0.0.1
GET http://request.example.org/test/ HTTP/1.1
Host: host.example.org
* Trying 127.0.0.1:80... * TCP_NODELAY set * Connected to 127.0.0.1 (127.0.0.1) port 80 (#0) > GET http://request.example.org/test/ HTTP/1.1 > Host: host.example.org > User-Agent: curl/7.68.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Server: nginx/1.23.1 < Date: Fri, 21 Oct 2022 02:00:56 GMT < Content-Type: text/plain < Content-Length: 28 < Connection: keep-alive < * Connection #0 to host 127.0.0.1 left intact [host] = request.example.org
$host = Host标题
curl http://127.0.0.1/test/ -v \ -H "Host: host.example.org"
* Trying 127.0.0.1:80... * TCP_NODELAY set * Connected to 127.0.0.1 (127.0.0.1) port 80 (#0) > GET /test/ HTTP/1.1 > Host: host.example.org > User-Agent: curl/7.68.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Server: nginx/1.23.1 < Date: Fri, 21 Oct 2022 02:01:37 GMT < Content-Type: text/plain < Content-Length: 25 < Connection: keep-alive < * Connection #0 to host 127.0.0.1 left intact [host] = host.example.org
$host = server_name(在Nginx配置中)
# HTTP 1.1 must have Host header, so use HTTP 1.0 curl http://127.0.0.1/test/ -v -H "Host:" -0
* Trying 127.0.0.1:80... * TCP_NODELAY set * Connected to 127.0.0.1 (127.0.0.1) port 80 (#0) > GET /test/ HTTP/1.0 > User-Agent: curl/7.68.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Server: nginx/1.23.1 < Date: Fri, 21 Oct 2022 02:02:20 GMT < Content-Type: text/plain < Content-Length: 22 < Connection: close < * Closing connection 0 [host] = *.example.org
参考:ngx_http_核心_模块,Nginx $host确认
3条答案
按热度按时间1yjd4xko1#
$host
是核心模块的变量。$主机
此变量等于请求标头中的行Host,如果Host标头不可用,则等于处理请求的服务器的名称。
在以下情况下,此变量的值可能与$http_host的值不同:1)当主机输入头不存在或具有空值时,$host等于server_name指令的值; 2)当Host的值包含端口号时,$host不包含该端口号。$host的值从0.8.17开始始终为小写。
$http_host
也是同一个模块的变量,但是你不会找到它的名字,因为它一般被定义为$http_HEADER
(ref)。$http_标题
HTTP请求标头HEADER的值(转换为小写,并且“破折号”转换为“下划线”),例如$http_user_agent、$http_referer...;
总结:
$http_host
总是等于HTTP_HOST
请求报头。$host
相等$http_host
,小写且不含连接埠号码(如果有的话),除非HTTP_HOST
不存在或为空值。在这种情况下,$host
相等行程要求之服务器的server_name
指示词值。ssm49v7z2#
已接受的答案及其注解似乎(不再)正确。
按照以下优先顺序:请求行中的主机名,或“Host”请求头字段中的主机名,或与请求匹配的服务器名
因此
$http_host
始终是Host
标头字段的值。如果请求行中的主机(如果指定)与Host
标头字段不同,或者Host
标头未设置,则它们可能不同。server_name
仅与Host
报头字段(http://nginx.org/en/docs/http/request_processing.html)匹配,因此$host
可能不同于匹配的server_name
。7hiiyaii3#
第一个月
$http_host
始终等于Host
请求报头字段$host
的名称$host
的优先级顺序如下(从高到低):Host
请求报头字段server_name
(Nginx配置中),即使server_name
是通配符(例如:server_name *.example.org;
)请求行中的主机名
当打开URL
http://example.org/test/
时...大多数浏览器都是这样发送请求的
大多数浏览器不会这样发送请求(但这是有效请求)
确认
Nginx测试配置
当所有存在时...
$host
=来自请求行的主机名此命令将
127.0.0.1
GET http://request.example.org/test/ HTTP/1.1
形式发送请求路径Host
标头设置为Host: host.example.org
当仅存在
Host
标头时...$host
=Host
标题当不存在时...
$host
=server_name
(在Nginx配置中)参考:ngx_http_核心_模块,Nginx
$host
确认