【nginx】代理设置Host

旧文章从语雀迁移过来,原日期为2021-02-18

nginx 的 proxy 模块使我们经常会用到的模块之一,比如我们常用的 nginx 反向代理。

反向代理我们一般有这么几行配置代码:

  location /api {
    proxy_pass  http://127.0.0.1:9090;
    proxy_set_header Host $host;
    ...
  }

proxy_pass 是反向代理的目的地址,是比较熟悉的,但第三行是什么意思呢?

proxy_set_header#

这个配置是允许你代理后修改请求头的各个字段,可支持 nginx 内置变量、字符串和两种组合方式。

Host#

这次要详细理解的是 Host 的几种配置:

  1. proxy_set_header Host $proxy_host
  2. proxy_set_header Host $http_host
  3. proxy_set_header Host $host

测试流程:

  1. postman发送请求nginx服务127.0.0.1:4000;
  2. nginx中转后node服务127.0.0.1:9090;
  3. node服务打印request.host看看是什么。

$proxy_host#

默认值(不配置等同于配置了 proxy_set_header Host $proxy_host),nginx 配置:

  location /api {
    proxy_pass  http://127.0.0.1:9090;
  }
  或
 	location /api {
    proxy_pass  http://127.0.0.1:9090;
    proxy_set_header Host $proxy_host
  }

代理后的请求头的 Host : 127.0.0.1:9090 ,所以$proxy_host 为 proxy_pass 中的域名
**

$http_host#

nginx 配置:

  location /api {
    proxy_pass  http://127.0.0.1:9090;
    proxy_set_header Host $http_host;
  }

postman 另外配置头部中的 Host:
image.png
代理后的请求头的 Host : www.baidu.com ,所以$http_host 为代理前的请求头的 Host。
**

$host#

$host 根据文档介绍,如果请求头有 Host 字段会取该字段,否则就会去主服务器名(也就是 server_name )。

首先和 $http_host 一样,自定义 Host,得到的和 $http_host 是一致的,证明了前半句。

接着是传一个空的 Host,但实际上是不可行的,根据 HTTP/1.1 开规定,如果 Host 为空,会返回 400(如下图),nginx 也很好地实现了这个规定。

image.png
而HTTP/1.0是允许的,这里猜测是该字段为了HTTP/1.0设计的。

结论#

以上就是三种配置的差别,一般常用proxy_set_header Host $host

作者:liangshaoming

出处:https://www.cnblogs.com/liangshaoming/p/16974723.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

想得到更好阅读体验?不妨访问我的自建博客: https://simonliang20.github.io/

posted @   SimonLiang20  阅读(971)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示