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

laawzig2  于 2022-11-02  发布在  Nginx
关注(0)|答案(3)|浏览(458)

在Nginx中,变量$host$http_host之间有什么区别?

1yjd4xko

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指示词值。
ssm49v7z

ssm49v7z2#

已接受的答案及其注解似乎(不再)正确。
按照以下优先顺序:请求行中的主机名,或“Host”请求头字段中的主机名,或与请求匹配的服务器名
因此$http_host始终是Host标头字段的值。如果请求行中的主机(如果指定)与Host标头字段不同,或者Host标头未设置,则它们可能不同。
server_name仅与Host报头字段(http://nginx.org/en/docs/http/request_processing.html)匹配,因此$host可能不同于匹配的server_name

7hiiyaii

7hiiyaii3#

第一个月

$http_host始终等于Host请求报头字段

Host: example.org

$host的名称

$host的优先级顺序如下(从高到低):

  • 来自请求行的主机名
GET http://example.org/test/ HTTP/1.1
  • Host请求报头字段
  • 匹配请求的server_name(Nginx配置中),即使server_name是通配符(例如:server_name *.example.org;

请求行中的主机名

当打开URL http://example.org/test/时...
大多数浏览器都是这样发送请求的

GET /test/ HTTP/1.1
Host: example.org

大多数浏览器不会这样发送请求(但这是有效请求)

GET http://example.org/test/ HTTP/1.1

确认

Nginx测试配置

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: 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 = 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确认

相关问题