Nginx自定义请求头head失效问题

在配置Nginx做转发的时候,踩了一个不错的坑,这个坑是这样的,后端在获取请求头的值得时候,一直取到的是null,比如java

httpRequest.getHeader("jwt_token")

这个一直返回null,原因是Nginx的配置

underscores_in_headers

这个值默认是off,表示请求头如果带下划线默认是忽略掉的,恰巧自定义的请求头就是带了下划线,这是后需要配置为:

underscores_in_headers on;

 

具体原因:去看Nginx源码吧。

<think>好的,用户现在想了解跨域问题中设置'Access-Control-Allow-Origin'的原因以及整个流程是怎么样的。首先,我需要回忆一下CORS(跨源资源共享)的基本原理。跨域问题主要是因为浏览器的同源策略,它阻止不同源的请求,比如不同域名、端口或协议。而设置这个响应就是为了告诉浏览器该资源允许被指定的源访问。 接下来,用户可能对具体的流程不太清楚,需要详细解释。流程分为简单请求和非简单请求两种情况。简单请求如GET、POST等,直接送请求,服务器返回相应的CORS,浏览器检查是否允许。非简单请求比如PUT、DELETE或带有自定义的请求,会先送预检请求(OPTIONS),服务器响应允许的方法和之后,浏览器才会送实际请求。 然后,我需要考虑用户可能存在的疑问点。例如,为什么需要预检请求?这是因为非简单请求可能对服务器数据有更大影响,预检请求确保服务器明确允许这些操作,避免不必要的安全风险。另外,用户可能想知道如何具体配置服务器,尤其是Nginx或者后端框架中的设置方法,这时候需要给出示例配置,帮助他们实际操作。 还有,用户可能遇到常见的配置错误,比如忘记处理OPTIONS方法,或者有正确设置其他相关的如Access-Control-Allow-Methods和Access-Control-Allow-Headers。这时候需要提醒他们注意这些细节,并提供具体的解决方案。 最后,总结整个流程,强调服务器和浏览器之间的交互步骤,确保用户能够清晰地理解整个CORS的工作机制。同时,补充一些常见问题,比如为什么设置了*还是报错,可能是因为需要携带凭证(如cookies),这时候必须指定具体的源而不是通配符,或者需要设置Access-Control-Allow-Credentials。</think>$\boxed{跨域原理与流程详解}$ 跨域问题的核心是浏览器的 **同源策略(Same-Origin Policy)** 限制。通过设置`Access-Control-Allow-Origin`响应,服务端明确声明允许哪些外部域访问资源。以下是完整交互流程与技术细节: --- ### 一、跨域请求触条件 当以下任意一项不同时触跨域检测: - 协议(http/https) - 域名(主域/子域) - 端口号(8080/3000) **示例**: 从`http://a.com`请求`http://b.com/api` → 跨域 --- ### 二、CORS完整流程(分两类请求) #### 🔵 **1. 简单请求(Simple Request)** **条件**(同时满足): - 方法为 GET / HEAD / POST - 仅含以下请求头: `Accept`, `Accept-Language`, `Content-Language`, `Content-Type` (其中`Content-Type`仅限:`text/plain`, `multipart/form-data`, `application/x-www-form-urlencoded`) **交互流程**: ```mermaid sequenceDiagram Browser->>Server: 直接送实际请求(如GET) Server-->>Browser: 响应包含: Note right of Server: Access-Control-Allow-Origin: [指定域] 或 * Browser->>Browser: 检查响应是否匹配当前域 alt 匹配 Browser-->>JS: 返回数据 else 不匹配 Browser-->>JS: 触跨域错误 end ``` --- #### 🔴 **2. 预检请求(Preflight Request)** **触条件**(任一): - 使用 PUT / DELETE / PATCH 等方法 - 自定义请求头(如`X-Auth-Token`) - `Content-Type`为`application/json` **交互流程**: ```mermaid sequenceDiagram Browser->>Server: 送OPTIONS预检请求 Note left of Browser: 包含: Origin: http://a.com Access-Control-Request-Method: PUT Access-Control-Request-Headers: X-Custom-Header Server-->>Browser: 响应策略声明: Note right of Server: Access-Control-Allow-Origin: http://a.com Access-Control-Allow-Methods: PUT Access-Control-Allow-Headers: X-Custom-Header Access-Control-Max-Age: 86400 Browser->>Browser: 验证预检响应 alt 验证通过 Browser->>Server: 送实际PUT请求 Server-->>Browser: 返回真实数据(仍需包含CORS) else 验证失败 Browser-->>JS: 终止后续请求 end ``` --- ### 三、关键响应说明 | 响应 | 作用 | 示例值 | |---------------------------------|--------------------------------------|----------------------------------| | `Access-Control-Allow-Origin` | 允许访问的源(必选) | `http://a.com` 或 `*` | | `Access-Control-Allow-Methods` | 允许的HTTP方法(预检响应需要) | `GET, POST, PUT` | | `Access-Control-Allow-Headers` | 允许的自定义请求头(预检响应需要) | `X-Custom-Header, Content-Type` | | `Access-Control-Expose-Headers` | 允许前端读取的响应(非默认需声明)| `X-Total-Count` | | `Access-Control-Max-Age` | 预检结果缓存时间(秒) | `86400` (24小时) | | `Access-Control-Allow-Credentials` | 是否允许送Cookie(需与`Origin`显式配置配合) | `true` | --- ### 四、服务端配置示例 #### 🔧 Nginx配置 ```nginx location /api { # 基础CORS设置 add_header 'Access-Control-Allow-Origin' 'http://a.com'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type'; # 处理预检请求 if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 86400; add_header 'Content-Type' 'text/plain; charset=utf-8'; return 204; } } ``` #### 🔧 Node.js Express配置 ```javascript app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', 'http://a.com'); res.header('Access-Control-Allow-Methods', 'GET, POST, PUT'); res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); // 处理预检请求 if (req.method === 'OPTIONS') { res.header('Access-Control-Max-Age', '86400'); res.sendStatus(204); } else { next(); } }); ``` --- ### 五、常见错误场景 1. **通配符`*`失效**: 当请求携带Cookies等凭证时,`Access-Control-Allow-Origin`不能为`*`,必须明确指定域名,并设置: ```nginx add_header 'Access-Control-Allow-Credentials' 'true'; ``` 2. **未处理OPTIONS方法**: 若服务器未正确响应OPTIONS请求,浏览器将阻止后续实际请求。 3. **缓存污染**: 修改CORS策略后,需清理浏览器缓存或设置`Access-Control-Max-Age`为0。 --- $\boxed{核心总结}$ - **安全基石**:CORS是浏览器强制执行的策略,与服务端是否返回200状态码无关 - **流程本质**:通过预检请求协商安全策略,再执行实际请求 - **最佳实践**:生产环境应严格限制`Access-Control-Allow-Origin`为具体域名,避免使用`*`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值