preface

nginx 这个问题 还是上周 需要记录的, 最近公司 要倒闭了, 跟着老板 去了另一个公司,两边跑,有些累,今天记录下

问题

我们开发了一个 社区管理系统, 本来只有我前台页面写了一套 静态页面。通过 定时器 模拟了登录,请求等过程。后来后台开发了接口,然后我们本地连调没有问题,上了测试站, 登录后总是显示 status code 401 。后来查看日志 后台说 没有收到 token, 我这边浏览器查看的 请求头中 包含 token。 后来确认后台没收到 request header 中 xw_token这个字段 , 就怀疑 nginx 转发问题了。

但是 后台说 我们前后台 都是部署到 tomcat 中的, 不存在 nginx 转发问题。 当时 我也蒙蔽了,嗯的。 后来静静分析,前后台 都部署 tomcat 和 nginx 转发 半毛钱关系没有。

静静分析, 我们项目中的域名 都是通过 nginx 反向代理至 真正的项目地址, 所以说,每次网络请求都是 DNS -> ip -> nginx -> target server 。

问题出在 nginx 转发上

  1. 前后台都部署在 tomcat 不会产生跨域问题
  2. 前后台分离部署,可以通过 nginx 转发 来解决跨域问题(最初的误解 可能在这里, nginx 应用于 前后台的分离部署)
  3. 前后台都部署在 tomcat 中, 我们 也可以使用 nginx ,
    3.1 比如说 load-balance 时候 就可以 nginx 转发至多个 tomcat。
    3.2 一个域名 通过 nginx 反向代理 转发至 服务器(其实就是 3.1 中 一个tomcat 情况)
    3.3 我们主要是对外只有一个 公网 ip ,然后 通过 nginx + 子域名 运行多个项目

解决方案

nginx header 大小限制 nginx 401 header_nginx header 大小限制


本来以为 nginx 默认 没有转发请求头, 但是nginx 默认是转发的, 后来查了下 nginx 中 需要 开启 underscores_in_headers ,才可以在请求头中 使用 带下划线参数,否则 参数无效。

这个 nginx 指令是 ngx_http_core_module 中, 不是在 ngx_http_header 中。