【发布时间】:2013-03-03 03:05:39
【问题描述】:
在Nginx中,变量$host和$http_host有什么区别。
【问题讨论】:
标签: configuration nginx http-headers
在Nginx中,变量$host和$http_host有什么区别。
【问题讨论】:
标签: configuration nginx http-headers
$host 是Core 模块的变量。
$主机
这个变量等于请求头中的Host行或者 如果 Host 标头不是,则处理请求的服务器的名称 可用。
这个变量的值可能与 $http_host 不同 情况:1)当Host输入头不存在或值为空时, $host 等于 server_name 指令的值; 2)当值 of Host 包含端口号,$host 不包含该端口号。 从 0.8.17 开始,$host 的值总是小写。
$http_host 也是同一个模块的一个变量,但您找不到具有该名称的变量,因为它通常定义为 $http_HEADER (ref)。
$http_HEADER
HTTP 请求标头 HEADER 的值,当转换为小写并且“破折号”转换为“下划线”时,例如$http_user_agent, $http_referer...;
总结:
$http_host 始终等于 HTTP_HOST 请求标头。$host 等于 $http_host,小写且不带端口号(如果存在),HTTP_HOST 不存在或为空值时除外。在这种情况下,$host 等于处理请求的服务器的 server_name 指令的值。【讨论】:
server_name。如果您有多个server_names,则只会出现第一个。
server_name 指令,$server_name 变量是否等于 server_name 指令的值或选择的实际服务器名称?
$server_name 始终等于使用 server_name 指令指定的第一个值。例如,对于server_name example.com one.example.com two.example.com;,$server_name 将始终为“example.com”,无论用户指定了哪个主机。事实上,如果你没有default_server,主机可能是完全不同的东西(比如example.org)。
接受的答案及其 cmets 似乎不再正确。文档 (http://nginx.org/en/docs/http/ngx_http_core_module.html#var_host) 说 $host 是
按此优先顺序:请求行中的主机名,或“主机”请求标头字段中的主机名,或与请求匹配的服务器名称
所以$http_host 始终是Host 标头字段的值。如果请求行(如果指定)中的主机与 Host 标头字段不同,它们可能会有所不同。或者如果没有设置Host 标头。
server_name 仅匹配 Host 标头字段 (http://nginx.org/en/docs/http/request_processing.html),因此 $host 可能与匹配的 server_name 不同。
【讨论】: