当前位置: 首页 > news >正文

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

🌐 微前端部署实战: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 地址、域名、应用名称均为示例,实际部署时请替换为真实环境信息。


这篇文章现在可以安全地分享给团队、发布到知识库或作为新人培训材料使用。如果你还需要 PDF 或 Word 版本,我也可以帮你生成。

http://www.dtcms.com/a/577065.html

相关文章:

  • 短视频矩阵系统搭建指南:源码部署与全流程解析
  • 李沐动手学深度学习笔记(1)
  • 做网站云服务器选择多大带宽北京网站建设有哪些公司好
  • 第8章 模块系统
  • GraphRAG在Windows环境下离线部署
  • Spring Boot 实战:企业级接口限流与熔断机制设计
  • 二十一、二进制文件部署高可用集群
  • 窗口dp|组合数学
  • 【linux国庆练习】
  • 织梦cms怎么做双语网站wordpress网页小特效
  • 我的世界做壁纸的网站移动互联网开发心得体会
  • CST对电路板与地面平面耦合的电磁模拟
  • Apple授权登录开发流程
  • 告别手动导出:一键将思源笔记自动同步到 Git 仓库
  • OPPO 后端校招面试,过于简单了!
  • element表格的行列动态合并
  • C++ 零基础入门与冒泡排序深度实现
  • 鸿蒙harmony将注册的数据包装成json发送到后端的细节及过程
  • JavaWeb(后端进阶)
  • VOC浓度快速测定仪在厂界预警中的实战应用:PID传感器技术与数据分析
  • 【SRE】安装Grafana实践
  • 在 PHP 中打印数据(调试、输出内容)
  • 网站运营有什么用做公司网站需要了解哪些东西
  • 段描述符属性测试
  • Ubuntu安装mysql5.7及常见错误问题
  • 第四届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2025)
  • 网站后台编辑网站开发科普书
  • 单位加强网站建设专门做素菜的网站
  • Rust 在内存安全方面的设计方案的核心思想是“共享不可变,可变不共享”
  • NXP的GUI Guider开发LVGL