解决 Nginx 代理后 HTTP 头部丢失的问题:以 access_token 为例

news/2025/2/21 14:19:03/
http://www.w3.org/2000/svg" style="display: none;">

文章目录

  • 前言
  • 一、问题描述
  • 二、问题原因
  • 三、解决方案
    • 3.1 启用 underscores_in_headers
    • 3.2 重新加载 Nginx 配置
  • 总结


前言

在日常开发和运维中,我们经常会使用 Nginx 作为反向代理服务器,将客户端的请求转发到后端服务。然而,在某些情况下,通过 Nginx 代理后,后端服务可能会丢失部分 HTTP 头部信息,尤其是包含下划线(_)的头部,例如 access_token。本文将详细介绍如何解决这一问题。

一、问题描述

今天遇到一个典型的问题:通过 Nginx 代理访问后端服务时,后端服务报错:

该接口的认证类型为授权码认证类型,请在请求头中添加 access_token 参数

直接访问后端服务的地址可以正常返回数据,但通过 Nginx 代理后却报错。经过排查,发现是 access_token 头部在代理过程中丢失了。

二、问题原因

Nginx 默认会忽略包含下划线(_)的 HTTP 头部。这是因为下划线在 HTTP 头部中是非标准的字符,可能会导致某些服务器或客户端无法正确处理。因此,Nginx 默认会丢弃这些头部。

三、解决方案

3.1 启用 underscores_in_headers

为了让 Nginx 能够传递包含下划线的头部,需要在 Nginx 配置中启用 underscores_in_headers 指令。需要注意的是,这个指令必须放在 http 块或 server 块中,而不能放在 location 块中。

修改 Nginx 配置文件(通常是 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf):

http {# 允许传递包含下划线的头部underscores_in_headers on;server {listen 80;server_name your_domain.com;location /proxy-data/ {proxy_pass http://172.17.17.17:18081;proxy_pass_request_headers on;# 可选:转发特定的 headerproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}

3.2 重新加载 Nginx 配置

修改配置文件后,测试配置文件是否正确,并重新加载 Nginx:

./nginx -t          # 测试配置文件是否正确
./nginx -s reload   # 重新加载 Nginx

总结

通过启用 underscores_in_headers 指令,可以解决 Nginx 代理后 HTTP 头部丢失的问题。

具体步骤如下:

  • http 块或 server 块中添加 underscores_in_headers on
  • 重新加载 Nginx 配置
  • 验证配置是否生效

https://i-blog.csdnimg.cn/direct/f12e9ac6d5ab416cb8d5e2c1f5174ccd.jpeg#pic_center" alt="在这里插入图片描述" />


http://www.ppmy.cn/news/1573904.html

相关文章

DeepSeek系统架构的逐层分类拆解分析,从底层基础设施到用户端分发全链路

一、底层基础设施层 1. 硬件服务器集群 算力单元: GPU集群:基于NVIDIA H800/H100 GPU构建,单集群规模超10,000卡,采用NVLink全互联架构实现低延迟通信。国产化支持:适配海光DCU、寒武纪MLU等国产芯片,通过…

编写dockercompose脚本,管理redis,activemq,mysql5.7

编写dockercompose脚本,管理redis,activemq,mysql5.7,mysql的root密码设置Duke2007,redis密码设置duke0591 Docker Compose 多服务编排脚本(安全增强版) yaml 复制 services: # # MySQL 5.7 服务配置 #…

ubuntu安装docker docker/DockerHub 国内镜像源/加速列表【持续更新】

ubuntu安装docker & docker镜像代理【持续更新】 在Ubuntu上安装Docker,你可以选择两种主要方法:从Ubuntu的仓库安装,或者使用Docker的官方仓库安装。下面我会详细解释这两种方法。 方法一:从Ubuntu的仓库安装Docker 这种方…

【Linux】HTTP:Cookie 和 Session 详解

一、引入 Cookie 定义 HTTP Cookie(也称为 Web Cookie、 浏览器 Cookie 或简称 Cookie,中文意思为 “曲奇饼,小甜饼”) 是服务器发送到用户浏览器并保存在浏览器上的一小块数据, 它会在浏览器之后向同一服务器再次发…

cenos 安装 /usr/local/nginx/sbin/nginx这个路径的nginx

好的,我现在需要帮助用户解决在CentOS上安装Nginx到指定路径/usr/local/nginx/sbin/nginx的问题。首先,我得确认用户的需求是什么。用户可能已经知道如何安装Nginx,但希望将其安装到特定的目录,而不是默认的yum安装路径。通常&…

http 与 https 的区别?

HTTP(超文本传输协议)和 HTTPS(安全超文本传输协议)是互联网通信的基础协议。随着网络技术的发展和安全需求的提升,HTTPS变得越来越重要。本文将深入探讨HTTP与HTTPS之间的区别,包括其工作原理、安全性、性能、应用场景及未来发展等。 1. HTTP与HTTPS的基本概念 1.1 HT…

机械学习基础-9.进一步的无监督学习:聚类-数据建模与机械智能课程自留

data modeling and machine intelligence - FURTHER UNSUPERVISED LEARNING-CLUSTERING 聚类聚类可视化在聚类分析中定义数据点之间相似性 / 相异性的方法聚类优化问题 K - 均值聚类算法(K - Means Clustering)评估指标非唯一性问题 用于选择K值的肘部法…

DeepSeek - R1:模型架构深度解析

DeepSeek - R1:模型架构深度解析 引言 本文将深入探索DeepSeek - R1模型架构。将从输入到输出追踪DeepSeek - R1模型,找出架构中的新发展和关键部分。DeepSeek - R1基于DeepSeek - V3 - Base模型架构,本文旨在涵盖其设计的所有重要方面。 …