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

Nginx 搭建支持多版本和前端路由的静态网站

在你的场景下,history/ 目录是上一个版本,main/ 目录是当前版本。你希望通过 Nginx 反向代理,并利用 try_files 机制,使页面刷新时仍能正常访问(避免 404),同时支持 SPA 前端路由,并且能够切换不同版本的资源。


一、Nginx 解决方案

你可以使用 try_files 结合 main/ 和 history/ 目录,实现:

  • 默认加载 main/ 版本
  • 如果 main/ 目录找不到资源,就回退到 history/
  • 支持前端 SPA 刷新

Nginx 配置

nginx
复制编辑
server {listen 80;server_name yourdomain.com;location / {root /var/www/html;index index.html;try_files $uri $uri/ /main/index.html;}# 代理 main 版本location /main/ {root /var/www/html;index index.html;try_files $uri $uri/ /main/index.html;}# 代理 history 版本(如果 main 目录找不到文件,则回退到 history 版本)location /history/ {root /var/www/html;index index.html;try_files $uri $uri/ /history/index.html;}# 处理前端路由刷新 404 问题location /app/ {root /var/www/html;index index.html;try_files $uri /main/index.html;}error_page 404 /main/index.html;
}

二、关键点解析

  1. try_files $uri $uri/ /main/index.html;

    • 先尝试访问请求的静态文件 ($uri),如果找不到,再尝试访问目录 ($uri/),最后回退到 main/index.html 处理 SPA 路由。
  2. 支持 main/ 和 history/ 目录

    • /main/ 目录是当前版本,默认使用它。
    • /history/ 目录是上一个版本,如果 main/ 目录中找不到资源,就会尝试从 history/ 目录加载。
  3. error_page 404 /main/index.html;

    • 避免用户直接刷新时 404,Nginx 会回退到 main/index.html 让前端框架处理路由。

三、前端如何切换版本?

1. 通过 URL 参数控制

你可以在前端代码中检测 URL 参数,如 ?version=history,然后动态切换资源:

javascript
复制编辑
const version = new URLSearchParams(window.location.search).get("version") || "main";
document.write(`<script src="/${version}/app.js"></script>`);

2. Nginx 变量控制

如果你希望动态切换版本,可以使用 Nginx 变量:

nginx
复制编辑
set $version main; # 默认版本
if ($arg_version = history) {set $version history;
}
location / {try_files $uri /$version/index.html;
}

这样,你可以通过 yourdomain.com?version=history 访问历史版本。


三、总结

方案适用场景主要优点主要缺点
try_files 机制适用于 SPA 应用的版本切换切换新旧版本简单,不影响前端代码需要正确配置 Nginx
URL 参数控制前端加载适用于用户可自由选择版本用户体验好,可以灵活回退版本需要前端代码支持
Nginx 变量控制适用于自动化切换版本配置灵活,自动适配不同版本需要 Nginx 解析请求参数

这个方案可以完美解决前端发版导致的页面刷新问题,同时支持新旧版本共存!


文章转载自:

http://jrvEoxGp.ftntr.cn
http://NrhaHxzA.ftntr.cn
http://bxl8Tgdo.ftntr.cn
http://L7UUnWtv.ftntr.cn
http://q07BBsUr.ftntr.cn
http://hCAHgJ1F.ftntr.cn
http://QI9XgUHd.ftntr.cn
http://74Lj5dJh.ftntr.cn
http://0oAzLZxN.ftntr.cn
http://DZkXidew.ftntr.cn
http://On4mc6gh.ftntr.cn
http://EXHMKB5W.ftntr.cn
http://pmpYNLIH.ftntr.cn
http://7ek9yoqM.ftntr.cn
http://IqsXjHp2.ftntr.cn
http://aGvhj0JA.ftntr.cn
http://hTbJYaK0.ftntr.cn
http://AZy9B8XR.ftntr.cn
http://8Mkb4XoA.ftntr.cn
http://CSoTEBEi.ftntr.cn
http://iYzJ88dn.ftntr.cn
http://CFDJVzR6.ftntr.cn
http://h2TrffYD.ftntr.cn
http://7bo29Pds.ftntr.cn
http://wKiYMepg.ftntr.cn
http://uGxSTJ2R.ftntr.cn
http://Jvdxa3Nc.ftntr.cn
http://42LV4jdn.ftntr.cn
http://YNLeiKr0.ftntr.cn
http://JdslQPLj.ftntr.cn
http://www.dtcms.com/a/176070.html

相关文章:

  • 初始图形学(7)
  • C++并发编程完全指南:从基础到实践
  • 准确---Typora配置Gitee图床并实现自动图片上传
  • Windows环境下maven的安装与配置
  • 实践003-Gitlab CICD编译构建
  • 隐私计算技术及其在数据安全中的应用:守护数据隐私的新范式
  • python 闭包获取循环数据经典 bug
  • 滑动窗口——长度最小子数组
  • Go 并发错误处理利器:深入理解 errgroup
  • Kafka的消息保留策略是怎样的? (基于时间log.retention.hours或大小log.retention.bytes,可配置删除或压缩策略)
  • 【前端基础】7、CSS的字体属性(font相关)
  • 《Python星球日记》 第47天:聚类与KMeans
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.3.30)
  • 项目模拟实现消息队列第二天
  • spring 事务实现原理
  • RabbitMq学习(第一天)
  • C++中的位运算符:与、或、异或详解
  • 阿里云2核2g安装nexus
  • shell脚本--2
  • 如何在大型项目中解决 VsCode 语言服务器崩溃的问题
  • 【shardingsphere分布式主键无效】
  • Kubernetes(k8s)学习笔记(八)--KubeSphere定制化安装
  • C 语言编码规范
  • Selenium使用指南
  • 21. LangChain金融领域:合同审查与风险预警自动化
  • 802.11s Mesh 组网框架流程
  • 排序算法——桶排序
  • 一个电平转换电路导致MCU/FPGA通讯波形失真的原因分析
  • 阿里云codeup以及本地gitclone+http
  • AB测试面试题