Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 中间件

  • 云原生

  • 分布式

  • 存储技术

  • 数据库

  • 服务部署

    • 服务利用率
    • nginx

      • LearningNginx
      • nginx部署前端资源
      • nginx配置HOST请求头及与webpack-dev-server proxy的区别
        • 前言
        • 解决方案
        • 关于 $host 和 $http_host 的区别
          • $host
          • $http_host
          • 什么是请求行?
          • Host 请求头
          • 仅当以下情况 $host 等于 $http_host:
        • 参考:
    • web灰度发布方案
    • 虚拟化

  • 编程语言

  • 计算技术

  • 服务端
  • 服务部署
  • nginx
gahing
2019-04-09
目录

nginx配置HOST请求头及与webpack-dev-server proxy的区别

# 前言

遇到一个这样的场景:

往CAS系统进行认证需要带上当前(前端server)域名,拿到认证密钥后向后端发起鉴权,后端校验密钥时还会去校验鉴权url的 Host 和刚刚CAS认证时带的前端server域名是否一致,不一致的话即使密钥合法了也无用。

旧平台是jsp项目,所以 鉴权url Host 和 前端server域名 是一样的。

前后端分离后,前端发起的鉴权url是通过代理转发到后端,代理没有额外处理的情况下,该请求的 Host 指的是后端地址,导致后端鉴权时两个 host 匹配不上

# 解决方案

一开始是在本地开发环境(webpack-dev-server)上,利用 proxyTable 进行接口代理,结果发现后端鉴权通过了

而用 nginx 却出现 host不匹配的情况。

经过分析发现 proxyTable 转发时会带上请求头 Host ,比如

Host: localhost:3000

那么 nginx 代理规则里面也加上即可

proxy_set_header    Host    $host; # 80时不配端口,后端校验没有处理:80
# proxy_set_header    Host    $host:$server_port; #当端口非80时这样配置
1
2

后面发现可以直接

proxy_set_header    Host    $http_host;
1

就不用考虑是否非80了

# 关于 $host 和 $http_host 的区别

# $host

$host 按以下顺序匹配

  1. 请求行中的 host name 部分
  2. Host 请求头的 host name 部分
  3. 处理请求的 server 对应配置的 server_name

# $http_host

$http_host 定义在 $http_name

对应任意请求头字段。name 为请求头字段名称转换为小写,短划线由下划线替换

$http_host值为 Host 请求头数据

# 什么是请求行?

如:

GET /index.html HTTP/1.1
GET www.test.com/index.html HTTP/1.1
1
2

请求行可以不带 host部分

# Host 请求头

HTTP/1.0不支持Host请求头;

而在HTTP/1.1中,Host请求头部必须存在,否则会 400

# 仅当以下情况 $host 等于 $http_host:

  • 请求行中没有 host,Host请求头存在且其值为小写且不带端口号

从0.8.17版本开始,$host 值总是小写.

# 参考:

nginx docs (opens new window)

stackoverflow (opens new window)

Nginx $host变量详解 (opens new window)

编辑 (opens new window)
上次更新: 2023/08/26, 10:18:07
nginx部署前端资源
web灰度发布方案

← nginx部署前端资源 web灰度发布方案→

最近更新
01
我的 2024 总结
12-31
02
浅谈代码质量与量化指标
08-27
03
快速理解 JS 装饰器
08-26
更多文章>
Theme by Vdoing | Copyright © 2016-2025 Gahing | 闽ICP备19024221号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式