JS获取Nginx代理后header中自定义参数

本文详细介绍了如何在Nginx中开启并使用自定义Header参数,包括配置指令underscores_in_headers,通过$request变量获取请求头信息,以及如何在JS中读取这些自定义Header。同时对比了proxy_set_header与add_header的区别。

1、在http或者server开启nginx针对header自定义命名参数的下划线支持;

underscores_in_headers on;

2、获取request中header方式:'$http_' + 自定义header参数 (如有横杠转换为下划线且全部小写);

add_header Authorization $http_authorization;

* 举个栗子🌰 :

header ---> User-Type:app

nginx ---> add_header User-Type $http_user_type;

3、JS获取header中自定义参数;

let req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
let userType = req.getResponseHeader('User-Type') ? req.getResponseHeader('User-Type') : '';
//使用 sessionStorage 创建一个本地存储的 name/value 对存储
window.sessionStorage.setItem("userType", userType);

* 拓展(proxy_set_headeradd_header的区别):

https://blog.youkuaiyun.com/qq_30038111/article/details/95211271 

<think>好的,我现在需要帮助用户解决如何从HTTP请求头中提取参数的问题。用户提到了他们想获取header中的参数,并且需要示例代码。首先,我得回想一下不同后端框架中处理HTTP头的方法。 用户提供的引用中有两个相关的部分。引用[1]讲的是从URL路径和参数获取数据,比如使用@PathVariable和request.getParameter,这可能和当前问题不太直接相关,但用户现在关注的是请求头,所以可能需要参考引用[2]中的内容。引用[2]提到在Nginx获取自定义header参数,用户提供的PHP代码示例使用getallheaders()函数,或者在无法使用时通过$_SERVER变量来构造。这说明用户可能对如何在不同的后端环境中获取请求头感兴趣,比如Java Spring、PHP或者Node.js等。 接下来,我需要确定用户使用的技术栈。但用户没有明确说明,所以应该覆盖几种常见的情况,比如Spring Boot(Java)、PHP、Node.js(Express)、Python Flask等。这样用户可以根据自己的情况选择适合的方法。 对于Java Spring,处理方式通常是使用@RequestHeader注解。例如,在控制器方法中,添加@RequestHeader("Header名称")来直接获取对应的值。需要给出示例代码,如从Authorization头中获取token,这时候方法参数前加上@RequestHeader("Authorization")。 在PHP中,可以使用getallheaders()函数,或者通过$_SERVER超全局变量来访问。因为有些环境可能不支持getallheaders(),所以用户提供的代码片段中有一个兼容性处理函数。这时候示例代码应该展示如何获取特定的header,比如User-Agent。 对于Node.js的Express框架,可以通过req.headers对象来访问请求头,例如req.headers['user-agent']。这里需要给出一个路由处理的示例。 Python Flask的话,使用request.headers对象,类似于字典,比如request.headers.get('User-Agent')。同样需要示例代码。 另外,需要提醒用户注意大小写的问题,因为HTTP头名称是不区分大小写的,但不同框架可能处理方式不同。比如,有些可能自动转换为小写,有些则保留原样。此外,自定义头可能需要处理特殊的前缀,比如在Nginx中配置允许的头部。 还需要考虑跨平台的问题,比如某些服务器可能过滤掉自定义头,除非明确配置。例如,带下划线的头可能在Nginx中被忽略,需要调整配置。 用户可能的问题会有:如何确保服务器传递了自定义头?如何处理头名称的大小写?不同框架的差异?因此,在回答中需要涵盖这些注意事项,并提供相应的解决方案或提示。 最后,生成相关问题,帮助用户深入理解,比如如何获取特定头、处理大小写、自定义头的注意事项,以及不同框架的区别。这样用户可以根据自己的需求进一步探索。</think>### 从HTTP请求头中提取参数的方法 #### 1. Java Spring Boot 框架 在Spring Boot中,使用`@RequestHeader`注解可直接获取请求头参数: ```java @RestController public class DemoController { @GetMapping("/demo") public String getHeader(@RequestHeader("User-Agent") String userAgent) { return "User-Agent: " + userAgent; } } ``` 若需获取所有请求头,可通过`HttpHeaders`对象或`HttpServletRequest`: ```java @GetMapping("/allHeaders") public void getAllHeaders(@RequestHeader HttpHeaders headers) { String authToken = headers.getFirst("Authorization"); } ``` #### 2. PHP 语言 使用`getallheaders()`函数或自定义兼容方法(参考引用[^2]): ```php $headers = getallheaders(); $userAgent = $headers['User-Agent'] ?? '未找到'; ``` #### 3. Node.js (Express框架) 通过`req.headers`对象获取: ```javascript app.get('/demo', (req, res) => { const userAgent = req.headers['user-agent']; res.send(`User-Agent: ${userAgent}`); }); ``` #### 4. Python Flask框架 使用`request.headers`对象: ```python from flask import Flask, request app = Flask(__name__) @app.route('/demo') def get_header(): user_agent = request.headers.get('User-Agent') return f"User-Agent: {user_agent}" ``` ### 注意事项 1. **大小写不敏感**:HTTP头名称不区分大小写,但不同框架实现可能不同(如Node.js保留原始大小写,Spring Boot默认首字母大写)。 2. **自定义头处理**:若使用类似`X-Custom-Header`的自定义头,需确保服务器配置允许传递(如Nginx需设置`underscores_in_headers on`)。 3. **空值处理**:建议使用`get()`方法或空值判断避免异常,例如: ```java String customHeader = headers.getFirst("X-Custom-Header"); if (customHeader == null) { // 处理缺失逻辑 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值