搜索 Nginx 400 报错,很容易搜出一大堆的文章来,其中有说 cookie 过长、Host 为空、报文格式出错等等,最初先参考一些设置,给请求头加上了 Host ,比如
proxy_set_header Host $host;
或者
proxy_set_header Host $http_host;
,但还是报错,于是只好抓包进行查看,包括经过 Nginx 12345 端口转发的请求,和直接在 Nginx 服务器上调用外网接口的请求
在比对了之后发现,能调用成功的请求头中, Host 就是接口的域名地址,而调用失败的请求头中,该字段都是 IP 或者其他什么东西
先说解决的办法,有两种,以文章开头的配置内容为例,进行修改:
1. 设置静态的 Host 值
upstream test-interface {
server abc.test.cn;
server {
listen 12345;
server_name localhost;
location / {
proxy_pass http://test-interface;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host abc.test.cn;
2. 不使用 upstream ,直接 proxy pass 域名地址
server {
listen 12345;
server_name localhost;
location / {
proxy_pass http://abc.test.cn;
proxy_http_version 1.1;
proxy_set_header Connection "";
这两种配置都可以成功转发,因为转发的是域名地址,其实还涉及到 Nginx 在 DNS 解析方面的一个配置问题,暂且挖个坑,回头学习学习再来填上
— update 20210305 —
文章写完忘了更新这一篇了,补上:《Nginx 代理域名地址时的 DNS 缓存问题》
再折腾折腾
多测试了一些配置并抓包看了一下请求头中的 Host ,比如
upstream test-interface {
server abc.test.cn;
server {
listen 12345;
server_name localhost;
location / {
proxy_pass http://test-interface;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
Host 为 Nginx 服务器的 IP + 监听端口号:192.168.1.11:12345 ,请求失败
upstream test-interface {
server abc.test.cn;
server {
listen 12345;
server_name localhost;
location / {
proxy_pass http://test-interface;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
Host 为 Nginx 服务器的 IP :192.168.1.11 ,请求失败
upstream test-interface {
server abc.test.cn;
server {
listen 12345;
server_name localhost;
location / {
proxy_pass http://test-interface;
proxy_http_version 1.1;
proxy_set_header Connection "";
不显式设置 Host 时, Nginx 会默认重新定义 Host 为 $proxy_host
, 抓包可以看到 Host 为 upstream 的名字:test-interface ,请求失败
server {
listen 12345;
server_name localhost;
location / {
proxy_pass http://abc.test.cn;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
Host 被显式指定为 $host ,如上会变成 Nginx 服务器的 IP : 192.168.1.11 ,请求失败
server {
listen 12345;
server_name localhost;
location / {
proxy_pass http://abc.test.cn;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host "";
Nginx 配置中显式将 Host 置为空,抓包中看不到请求头中有 Host ,请求失败
NGINX Reverse Proxy
HTTP headers Host
400 Bad Request