无界微前端上线,解决重复添加 CORS 头的问题(*,https://yanshi2.toone.com.cn)

这是一个非常典型的 Nginx 配置需求,通常用于解决防止重复添加 CORS 头的问题。核心逻辑是判断请求头是否存在,如果不存在才添加。

在 Nginx 中,我们无法直接通过 if 语句来判断某个 HTTP 响应头是否已存在(因为 if 主要针对变量和请求信息)。因此,最优雅且通用的解决方案是利用 map 指令结合变量来实现逻辑判断。

以下是具体的配置方案:

核心配置逻辑

你需要将这段配置放在 Nginx 配置文件(通常是 nginx.conf 或站点配置文件)的 http 块中。

复制代码
1# 1. 使用 map 模块定义逻辑
2# $sent_http_access_control_allow_origin 是 Nginx 的内置变量,代表已经发送的 Access-Control-Allow-Origin 头值
3map $sent_http_access_control_allow_origin $cors_header {
4    # 如果已经有该头(值不为空),则变量值为空
5    ""      "https://yanshi2.toone.com.cn"; # 如果为空(即没有该头),则设置为目标域名
6    # 如果已经有值(即已有该头),则保持原样,不进行操作(这里设为空,配合下面的 default 指令)
7    default ""; 
8}

应用到 Server/Location 块

定义好变量后,你需要将其应用到具体的 serverlocation 块中。

复制代码
1server {
2    listen 80;
3    server_name your-domain.com;
4
5    # 2. 在需要的地方引用变量
6    # 注意:必须使用 add_header 指令,并且不能有 always 标志,否则会覆盖
7    # 如果你希望强制添加(例如处理预检请求),请确保逻辑正确
8    add_header Access-Control-Allow-Origin $cors_header always;
9
10    # ... 其他配置
11}

配置原理详解

  1. map 指令

    • 它创建了一个映射关系。这里我们检查 $sent_http_access_control_allow_origin
    • 如果该变量为空字符串(意味着 Nginx 尚未设置过这个头),$cors_header 就会被赋值为 https://yanshi2.toone.com.cn
    • 如果该变量不为空(意味着已经有代码或之前的配置设置了这个头),$cors_header 就会被赋值为空。
  2. add_header 指令

    • add_header 的值为空时,Nginx 会忽略这条指令,不会添加头。
    • add_header 的值为 https://yanshi2.toone.com.cn 时,Nginx 会添加该头。
    • 注意 :如果你的后端应用(如 Node.js、Java 等)已经添加了 *,Nginx 的这个配置将不会覆盖它,从而实现了"有则不加,无则添加"的逻辑。

⚠️ 特殊情况处理(针对预检请求)

如果你的场景涉及复杂的 CORS 请求(如带有自定义头的请求),浏览器会先发送 OPTIONS 预检请求。你可能需要显式处理这些请求,确保预检请求也能正确返回头信息:

复制代码
1location / {
2    # 处理预检请求
3    if ($request_method = 'OPTIONS') {
4        add_header Access-Control-Allow-Origin $cors_header;
5        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
6        add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
7        add_header Access-Control-Max-Age 1728000;
8        add_header Content-Type 'text/plain charset=UTF-8';
9        add_header Content-Length 0;
10        return 204;
11    }
12
13    # 处理正常请求
14    add_header Access-Control-Allow-Origin $cors_header;
15}

建议: 在修改配置后,请务必运行 nginx -t 测试配置语法,并重载服务 nginx -s reload 以使更改生效。

相关推荐
筱筱°2 个月前
创建一个基于 Vue 的微前端项目
vue.js·微前端
奋飛3 个月前
微前端系列:主流前端框架选型与对比
微前端·qiankun·micro-app·wujie·single-spa
Marshmallowc3 个月前
React stopPropagation 阻止冒泡失效?深度解析 React 17 事件委派机制变更与微前端冲突解决方案
前端·react.js·事件循环·微前端·前端架构
ZoeLandia4 个月前
Qiankun 生命周期与数据通信实战
前端·微前端·qiankun
奋飛4 个月前
微前端系列:隔离与通信机制
微前端·通信机制·micro·js沙箱·css隔离
passerma4 个月前
解决qiankun框架子应用打包后css里的图片加载404失败问题
前端·微前端·qiankun
奋飛4 个月前
微前端系列:核心概念、价值与应用场景
前端·微前端·micro·mfe·什么是微前端
Misha韩5 个月前
vue3+vite模块联邦 ----子应用中页面如何跳转传参
前端·javascript·vue.js·微前端·模块联邦
jason_renyu5 个月前
微前端沙盒隔离:原理、实现与高配面试题整理(一)
微前端·微前端面试题·微前端沙盒隔离·沙盒隔离