旧文章从语雀迁移过来,原日期为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:



代理后的请求头的 Host : www.baidu.com ,所以$http_host 为代理前的请求头的 Host。

**

$host

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

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

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



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

结论

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

最新文章

  1. PHP乱码完美解决
  2. Redis多机常用架构-cluster
  3. DevExpress更新至13.1.7
  4. BZOJ 1124: [POI2008]枪战Maf
  5. django base.html
  6. git 新建项目
  7. Jenkins 插件 CIFS
  8. Arrays.asList的源码分析
  9. Min and Max
  10. 【转】十款让 Web 前端开发人员更轻松的实用工具
  11. MVC3+EF5.0 code first+Flexigrid+ajax请求+jquery dialog 增删改查
  12. angular change the url , prevent reloading
  13. Windows服务器上使用phpstudy部署PHP程序
  14. spring+springmvc+hibernate 整合
  15. 起源-C的故事
  16. Confluence 6 链接到其他应用
  17. Doracle.jdbc.J2EE13Compliant=true
  18. openstack学习-nove计算节点部署(五)
  19. audio video 控制播放和停止
  20. meta viewport 理解

热门文章

  1. MySQL实战,SQL语句
  2. P1073 [NOIP2009 提高组] 最优贸易 (最短路spfa)
  3. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串
  4. SpringBoot+MyBatis Plus对Map中Date格式转换的处理
  5. Linux文本相关命令
  6. MySQL的日志文件
  7. 忘记了99乘法表啥样的了,python打印下看看
  8. Landau-Vishkin
  9. 将vue+nodejs项目部署到服务器上(完整版)
  10. Linux操作系统,笔录!