Nginx rewrite last 与 redirect 的区别——Vue history 模式短链接踩坑记录

背景

项目中需要将短链接 https://v3.abc.com/23-DLN25D 解析到 Vue 前端页面,并传递 mid=23code=DLN25D 两个参数。

Vue 项目使用 history 路由模式,入口文件为 redpack.html


Nginx 配置

bash 复制代码
location ~* ^/([0-9]+)-([A-Za-z0-9]+)$ {
    rewrite ^/([0-9]+)-([A-Za-z0-9]+)$ /redpack.html?mid=$1&code=$2 last;
}

location / {
    try_files $uri $uri/ /redpack.html;
}

问题现象

last 时,访问 https://v3.abc.com/23-DLN25D

  • curl -I 返回 HTTP 200,内容是 redpack.html(728字节),说明文件确实返回了
  • 但浏览器页面空白,Vue 组件的 created 不执行,没有任何反应

直接访问 https://v3.abc.com/redpack.html?mid=23&code=DLN25D 却完全正常。


原因分析

last redirect(302)
处理方式 Nginx 内部重定向 返回 302,浏览器重新发请求
浏览器地址栏 不变,仍是 /23-DLN25D 变为 /redpack.html?mid=23&code=DLN25D
Vue Router 看到的 path /23-DLN25D /redpack.html
路由是否匹配 未匹配,组件不加载 匹配 ScanEntry,组件正常加载

last 是 Nginx 内部完成整个处理,浏览器完全不知道发生了重写,地址栏 path 仍是 /23-DLN25D。Vue Router history 模式拿到这个 path,路由表里找不到对应规则,组件不挂载,created 自然不执行。

redirect 让浏览器收到 302 后真正跳转 到新 URL,地址栏变化,Vue Router 拿到正确的 /redpack.html 路径,路由匹配成功,一切正常。


解决方案

last 改为 redirect

bash 复制代码
location ~* ^/([0-9]+)-([A-Za-z0-9]+)$ {
    rewrite ^/([0-9]+)-([A-Za-z0-9]+)$ /redpack.html?mid=$1&code=$2 redirect;
}

location / {
    try_files $uri $uri/ /redpack.html;
}

总结

当 Vue history 模式的路由需要依赖 URL path 匹配时,Nginx rewrite 必须用 redirectpermanent,而不能用 lastlast 只适合纯后端处理的场景,前端路由感知不到内部重写。

相关推荐
是上好佳佳佳呀41 分钟前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
CDN3601 小时前
排查实录:网站偶发502/504错误?360CDN回源超时配置与日志分析技巧
前端·数据库
之歆2 小时前
Day07_CSS盒子模型 · 样式继承 · 用户代理样式
前端·css
DanCheOo2 小时前
AI 应用的安全架构:Prompt 注入、数据泄露、权限边界
前端·人工智能·prompt·安全架构
We་ct3 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
weixin_427771613 小时前
前端调试隐藏元素
前端
遇见火星4 小时前
Nginx限流配置:防止接口被刷,服务器稳如泰山
运维·服务器·nginx
爱上好庆祝4 小时前
学习js的第五天
前端·css·学习·html·css3·js
C澒4 小时前
IntelliPro 产研协作平台:基于 AI Agent 的低代码智能化配置方案设计与实现
前端·低代码·ai编程
一袋米扛几楼985 小时前
【Git】规范化协作:详解 GitHub 工作流中的 Issue、Branch 与 Pull Request 最佳实践
前端·git·github·issue