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

背景

项目中需要将短链接 https://v3.abc.com/23-DLN25D 解析到 Vue 前端页面,并传递 mid=23、code=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 必须用 redirect 或 permanent,而不能用 last。last 只适合纯后端处理的场景,前端路由感知不到内部重写。

相关推荐
其实防守也摸鱼16 分钟前
Cylab在线靶场——挑战图书馆初学者指南
服务器·前端·数据库·chrome·安全·网络安全·靶场
拆房老料2 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
曹牧8 小时前
C#:空合并运算符
java·前端·数据库
小羊没烦恼!8 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
智能直播11 小时前
RK3518:1.5G 内存 + 8G 存储,如何跑起硬件编解码、Web、AI 识别、绿幕特效
前端·人工智能·5g
掘金酱12 小时前
【10.24 特别活动】AI 时代,程序员的新饭碗在哪里?
前端·人工智能·后端
excel12 小时前
多进程环境下使用 PM2 部署 Socket.IO:需要注意什么
前端
IT_陈寒13 小时前
Redis的原子性竟然失效了?记一次分布式锁翻车实录
前端·人工智能·后端
时间的情敌14 小时前
《回顾 2018 前端:Vue2 成熟期,Webpack4 发布,PWA 大火》
前端
Java后端的Ai之路15 小时前
前端技术Vue-09-webpack-vuejs-实战
前端·vue.js·webpack