Nginx中$ host和$ http_host有什么区别


Answers:


217

$host核心模块的变量。

$主机

如果Host标头不可用,则此变量等于请求标头中的Host行或处理请求的服务器名称。

在以下情况下,此变量的值可能与$ http_host不同:1)当Host输入头不存在或值为空时,$ host等于server_name指令的值;2)当主机的值包含端口号时,$ host不包含该端口号。自0.8.17起,$ host的值始终为小写。

$http_host也是同一模块的变量,但是您找不到具有该名称的变量,因为它通常被定义为$http_HEADERref)。

$ http_HEADER

HTTP请求标头HEADER的值转换为小写且“破折号”转换为“下划线”时,例如$ http_user_agent,$ http_referer ...;


总结:

  • $http_host始终等于HTTP_HOST请求标头。
  • $host等于$http_host小写且没有端口号(如果存在),除非HTTP_HOST不存在或为空值。在这种情况下,$host等于server_name处理请求的服务器的指令的值。

57
$ host特别是在当前服务器块中定义的第一个server_name主机。如果您有多个server_name,则只会显示第一个。
乔纳森·瓦纳斯科

4
真正。实际上,定义是很典型的:server_name example.com www.example.com;
glarrain

您也可以有多个server_name指令。如果您在第一个中碰巧有一个正则表达式,则它成为$host,并且在重写规则期间可能会发生各种难看的事情。
乔纳森·瓦纳斯科

5
如果存在多个指令,该$server_name变量是否等于server_name指令的值或所选的实际服务器名称server_name
CMCDragonkai 2014年

1
@CMCDragonkai $server_name始终等于使用server_name指令指定的第一个值。例如,具有server_name example.com one.example.com two.example.com;$server_name将始终是“example.com”,无论哪个主机用户已经指定的。实际上,如果您没有default_server,则主机可能是完全不同的主机(例如example.org)。
ATLief
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.