【问题标题】:What's the difference of $host and $http_host in NginxNginx 中的 $host 和 $http_host 有什么区别
【发布时间】:2013-03-03 03:05:39
【问题描述】:

在Nginx中,变量$host$http_host有什么区别。

【问题讨论】:

    标签: configuration nginx http-headers


    【解决方案1】:

    $hostCore 模块的变量。

    $主机

    这个变量等于请求头中的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 指令的值。

    【讨论】:

    • $host 具体是在当前服务器块中定义的第一个server_name。如果您有多个server_names,则只会出现第一个。
    • 是的。其实很典型的定义是:server_name example.com www.example.com;
    • 如果有多个 server_name 指令,$server_name 变量是否等于 server_name 指令的值或选择的实际服务器名称?
    • @CMCDragonkai $server_name 始终等于使用 server_name 指令指定的第一个值。例如,对于server_name example.com one.example.com two.example.com;$server_name 将始终为“example.com”,无论用户指定了哪个主机。事实上,如果你没有default_server,主机可能是完全不同的东西(比如example.org)。
    • 链接现在有点 404。
    【解决方案2】:

    接受的答案及其 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 不同。

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 1970-01-01
      • 2011-08-30
      • 2011-10-28
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多