详细介绍:[特殊字符] 微前端部署实战:Nginx 配置 HTTPS 与 CORS 跨域解决方案(示例版)

news/2025/12/7 22:30:01/文章来源:https://www.cnblogs.com/yangykaifa/p/19319020

微前端部署实战:Nginx 配置 HTTPS 与 CORS 跨域解决方案(示例版)

作者:运维/前端开发
日期:2025 年 10 月 28 日
场景:基于 qiankun 的微前端架构,主应用与子应用分别部署在不同端口


一、问题背景

在一次微前端项目部署中,主应用运行在 https://app.example.com:8600,子应用 subapp-demo 运行在 https://app.example.com:8602。使用 qiankun 框架加载子应用时,页面始终无法加载,浏览器控制台报错:

Access to fetch at 'https://app.example.com:8602/' from origin 'https://app.example.com:8600'
has been blocked by CORS policy:
The 'Access-Control-Allow-Origin' header has a value 'https://app.example.com:8602'
that is not equal to the supplied origin.

经过排查,发现是 CORS 配置错误导致子应用拒绝了主应用的访问请求。本文将详细记录问题排查过程,并系统介绍 Nginx 配置 HTTPS 与 CORS 的最佳实践。


✅ 二、问题根源分析

❌ 错误配置片段

add_header 'Access-Control-Allow-Origin' 'https://app.example.com:8602' always;

错误点解析

  • Access-Control-Allow-Origin 表示“​允许谁访问我​”。
  • 子应用运行在 8602 端口,它应该允许主应用 https://app.example.com:8600 访问。
  • 但上述配置错误地将“允许来源”设置为 ​自己​,即 8602,导致浏览器拒绝跨域请求。

✅ 正确做法:子应用应允许主应用的域名(含端口)访问。


三、Nginx 配置 HTTPS 与 CORS 的完整步骤

第一步:准备 SSL 证书

HTTPS 需要 SSL 证书加密通信。你可以使用:

  • 自签名证书(开发/测试环境)
  • Let’s Encrypt 免费证书(生产环境)
  • 商业 CA 证书(如 DigiCert、阿里云等)
生成自签名证书(示例)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout app.example.com.key \
-out app.example.com.pem \
-subj "/CN=app.example.com"

将生成的 .pem.key 文件放置在 Nginx 可访问路径,如 /etc/nginx/ssl/


第二步:配置 Nginx HTTPS 服务(子应用)

# 业务子应用(8602端口)
server {listen 8602 ssl;                          # 开启 HTTPS 监听 8602 端口server_name app.example.com;              # 服务器域名# SSL 证书配置ssl_certificate /etc/nginx/ssl/app.example.com.pem;ssl_certificate_key /etc/nginx/ssl/app.example.com.key;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;ssl_protocols TLSv1.2 TLSv1.3;            # 支持的 TLS 协议版本ssl_prefer_server_ciphers off;            # 不优先使用服务器加密套件client_max_body_size 150M;                # 允许最大上传文件大小add_header X-Frame-Options SAMEORIGIN;    # 防止点击劫持,允许同源嵌套# ✅ 正确的 CORS 配置:允许主应用访问add_header 'Access-Control-Allow-Origin' 'https://app.example.com:8600' always;add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,Cache-Control,Content-Type,Sec-Fetch-Mode,If-Modified-Since,Range,Authorization' always;add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;location / {root   /var/www/subapp-demo/dist;index  index.html;try_files $uri $uri/ /index.html;      # 支持前端路由 history 模式}# 处理预检请求(OPTIONS)if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' 'https://app.example.com:8600' always;add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,Cache-Control,Content-Type,Sec-Fetch-Mode,If-Modified-Since,Range,Authorization' always;add_header 'Access-Control-Max-Age' 86400;     # 预检结果缓存 24 小时add_header 'Content-Length' 0;return 204;                                   # 返回空响应}
}

第三步:参数详解

参数含义建议值
listen 8602 ssl监听 8602 端口并启用 SSL生产环境建议使用 443
ssl_certificateSSL 证书路径.pem.crt 文件
ssl_certificate_keySSL 私钥路径.key 文件
ssl_protocols支持的 TLS 版本TLSv1.2 TLSv1.3
ssl_ciphers加密套件推荐使用前向安全(ECDHE)
client_max_body_size最大请求体大小根据业务调整(如文件上传)
add_header X-Frame-Options SAMEORIGIN防止 iframe 劫持安全必备
Access-Control-Allow-Origin允许跨域访问的来源必须是主应用地址
Access-Control-Allow-Methods允许的 HTTP 方法至少包含 GET, OPTIONS
Access-Control-Allow-Headers允许的请求头包含常用头,如 Authorization
Access-Control-Max-Age预检请求缓存时间86400(24 小时)

第四步:重启 Nginx

# 测试配置是否正确
sudo nginx -t
# 重新加载配置(无需重启服务)
sudo nginx -s reload

✅ 四、验证是否成功

  1. 访问主应用:https://app.example.com:8600
  2. 打开浏览器开发者工具 → Network 标签
  3. 查看对 https://app.example.com:8602/ 的请求:
    • ✅ 状态码:200
    • ✅ 响应头包含:
      Access-Control-Allow-Origin: https://app.example.com:8600
    • ✅ 控制台无 CORS 错误
    • ✅ 子应用正常渲染

五、常见错误总结

错误现象原因解决方案
ERR_CONNECTION_TIMED_OUT域名/IP 或端口错误检查主应用中 entry 配置
ERR_FAILED 200 (OK)CORS 被拦截检查 Access-Control-Allow-Origin 是否正确
Access-Control-Allow-Origin 值错误写成了自己必须写成调用方(主应用)地址
OPTIONS 请求失败未处理预检添加 if ($request_method = 'OPTIONS')
混合内容(Mixed Content)HTTP 资源在 HTTPS 页面加载确保所有资源使用 HTTPS

六、最佳实践建议

  1. 使用域名代替 IP​:如 app.yourcompany.com,便于管理和证书申请。
  2. 统一 CORS 管理​:建议由 Nginx 统一处理,避免前端代码注入错误头。
  3. ​**生产环境避免 ***​:Access-Control-Allow-Origin: * 不能与 withCredentials 共用,建议白名单。
  4. 使用 Let’s Encrypt 自动续期​:配合 certbot 实现证书自动更新。
  5. 日志监控​:开启 Nginx access_log 和 error_log,便于排查问题。

结语

微前端架构中,​跨域问题是最常见的部署障碍之一​。通过正确配置 Nginx 的 HTTPS 与 CORS,不仅可以解决加载问题,还能提升系统安全性和稳定性。

本文通过一个真实案例,系统梳理了从问题发现、分析到解决的全过程,并提供了可复用的 Nginx 配置模板。希望对正在搭建微前端架构的你有所帮助!

关键口诀​:
“CORS 的 Allow-Origin 是写给‘调用方’看的,不是写给‘自己’看的!”


附:主应用 qiankun 注册代码示例

registerMicroApps([
{
name: 'subapp-demo',
entry: 'https://app.example.com:8602',
container: '#subapp-viewport',
activeRule: '/subapp-demo',
},
]);

如需本文的 Markdown 源码或 Nginx 配置模板,欢迎联系作者获取。


✅ ​说明​:本文中所有 IP 地址、域名、应用名称均为示例,实际部署时请替换为真实环境信息。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git预提交钩子实现代码美化自动化

本文介绍如何使用Git的pre-commit钩子结合astyle工具,在提交代码前自动美化代码格式,尤其适用于需要遵循特定编码规范(如Linux内核风格)的开发场景,提高代码质量和一致性。大家好。 在这篇文章中,我将分享我创建…

五、Java数组

本文系统讲解Java数组的核心概念与应用,涵盖数组声明创建、内存分析、多维数组、Arrays工具类及稀疏数组实现,适合Java初学者夯实基础,并为后续学习集合框架奠定坚实基础。1. 数组概述数组是相同数据类型的有序集合…

122_尚硅谷_init函数

122_尚硅谷_init函数1.init基本介绍 2.如果一个文件同时包含全局变量, init函数和main函数, 那么执行的顺序是:全局变量定义_init函数_main函数 3.utils包中有init会在main中导入后,先执行utils.go文件中的init

《安全测试指南》——会话管理测试【学习笔记】

【会话管理测试】*部分括号内容均为个人理解 。 1. 会话管理架构绕过测试(OTG-SESS-001)主要测试会话cookie是否不可预测。攻击模式:cookie搜集(搜集足够数量的cookie样本)cookie逆向工程(分析Cookie生成算法) …

氛围编程工具个人推荐

氛围编程工具个人推荐大模型推理能力(脑子) > 编辑器功能(手)。它更推崇拥有强大逻辑架构能力的模型(如Claude),而不是单纯的IDE集成工具。第一梯队 (First Echelon):主力军这一层级是作者认为完成“Vibe C…

Windows 11全面AI化:语音助手与自主代理技术解析

某中心对Windows 11进行大规模改造,引入了“Hey Copilot”语音唤醒、可分析屏幕内容的Copilot Vision以及能自主操控电脑完成任务的Copilot Actions等AI功能。这些技术构建了全新的人机交互模式,并涉及新的安全架构以…

20251207

明天试试自己独立完成老师布置的作业

MyBatis自定义拦截器

在Spring Boot中配置MyBatis拦截器的核心是将自定义拦截器注册到MyBatis的SqlSessionFactory中(MyBatis所有拦截器都需通过该工厂注册才能生效)。以下是完整、分场景的配置方案,包含基础配置、多拦截器、属性定制、…

网线大鲨鱼

使用wireshark打开下载文件,搜索字符串ctf,选择分组字节流发现flag,/?s=moectf%7Bw1r3shark_1s_s0_3asy%7D&_pjax=%23page 解码获得最终flag:moectf{w1r3shark_1s_s0_3asy}

深入解析:mysql内置函数——了解常用的函数

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【P1】win10安装 Docker教程 - 详解

【P1】win10安装 Docker教程 - 详解2025-12-07 22:11 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

csq-蓝桥杯python-基础语法1-逻辑运算与条件语句

csq-蓝桥杯python-基础语法1-逻辑运算与条件语句一、什么是逻辑运算?在 Python 中,比较运算(如 > < ==)的结果是布尔值 True 或 False。 实际开发中经常需要组合多个条件,例如:年龄大于 18 并且身高大于 1…

高级语言程序设计第八次个人作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/gjyycx/homework/15590 学号:102400111 姓名:蔡伟仡 一.编写并运行书本第11章11.13编…

Cor1e的支票

打开下载文件,看见。!?三个符号,想到OoK加密将。改成OoK.,!改成OoK!,?改成OoK?在https://www.dcode.fr/ook-language 解密,获得flag

卷积神经网络是从多层感知机基础上发展起来的吗?

卷积神经网络是从多层感知机基础上发展起来的吗? 在深度学习的发展历程中,卷积神经网络(CNN)和多层感知机(MLP)是两大核心架构,二者时常被放在一起比较。一个常见的疑问是:卷积神经网络是否从多层感知机的基础…

gaussdb json解析

gaussdb (GaussDB Kernel 503.1.0.SPC1200 build c28d95e9) -- 序列 CREATE SEQUENCE seq_head_id START WITH 1; CREATE SEQUENCE seq_line_id START WITH 1;-- 头表 CREATE TABLE head_t (head_id BIGINT PRIMARY KE…

详细介绍:python logging模块:专业日志记录

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JAX核心设计解析:函数式编程让代码更可控

很多人刚接触JAX都会有点懵——参数为啥要单独传?随机数还要自己管key?这跟PyTorch的画风完全不一样啊。 其实根本原因就一个:JAX是函数式编程而不是面向对象那套,想明白这点很多设计就都说得通了。 先说个核心区别…

20232305 2025-2026-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 1.1 学习Web前后端语言. 1.2 搭建一个简单的登录网站。 1.3 尝试对网站进行SQL注入,XSS,CSRF攻击。 2.实验过程 2.1 Web前端HTML 2.1.1 安装,启停Apache Apache是一种开源Web服务器软件,其核心功能是接…