nginx配置,将前端项目配置到子路径下踩过的坑。

实战场景还原:为什么静态资源被误捕获?

在项目中,使用了以下配置处理 Vue 子应用 /pic/

nginx 复制代码
location /pic/ {
  alias /www/wwwroot/html2/dist/;
  index index.html;
  try_files $uri $uri/ /index.html;
}

发现:当存在全局正则 location ~ .*\\.(js|css)?$ 匹配(Regular Expressions Matches)路径时:

nginx 复制代码
location ~ .*\\.(js|css)?$ {
  expires 12h;
  access_log /dev/null;
}

请求诸如 /pic/assets/xxx.css 时,竟然没有走 /pic/ 块,而被这个正则拦住,导致静态资源 404 并且无日志输出------正因为 access_log 被重定向到 /dev/null

因为没有日志,导致排查问题的时候产生困惑,多次排查才找到问题所在。

踩坑原因:Nginx 匹配优先级误区

  • 正则匹配的优先级高于普通前缀匹配 。默认情况下,即使 /pic/ 前缀更具体,但是这是Nginx匹配里面的最低级匹配。
  • 匹配到正则块后,由于缺少 alias 或 root,Nginx 会用 server 块的 root 去访问 /html/_site/pic/assets/... → 404。

官方匹配优先级机制(技术详解)

Nginx 官方文档及社区总结的是这样的匹配优先级逻辑:

  1. Exact match location = /foo --- 精确匹配,优先级最高;
  2. Longest prefix match 普通前缀定位,选择最长匹配;
    • 若使用 ^~,一旦匹配则立即使用,不再检查正则;
  3. Regex match ~~* 类型,按声明顺序依次检查,一旦匹配,中止查找;
  4. 若无正则匹配,回退使用最长前缀。(Nginx, Stack Overflow)

例如:

  • 请求 /images/1.gif 遇到明显 /images/ 前缀,如果加了 ^~,则跳过所有正则判断,直接进入该位置处理。(DigitalOcean, Super User)
  • 社区补充说明:"^~ 修饰符能使前缀匹配优于 regex"(Server Fault, Super User)。

解决方案

推荐配置方式(屏蔽正则干扰,确保配置的 alias 生效):

nginx 复制代码
server {
  ...

  # 针对 /pic/ 使用 ^~ 提高优先级
  location ^~ /pic/ {
    alias /www/wwwroot/html2/dist/;
    index index.html;
    try_files $uri $uri/ /index.html;
  }

  # 全局静态资源缓存
  location ~* \.(js|css|gif|jpg|jpeg|png|bmp|swf)$ {
    expires 12h;
    # 不要屏蔽日志,便于问题排查
    # access_log /dev/null;
  }

  ...
}

这样 /pic/assets/*.css 会优先进入 /pic/,避免 regex 抢匹配。

可以参考High Priority Prefix Matches

关键配置原则总结:

  • 遇到一些静态资源访问不到的问题,可以打开日志查看。
  • 如果日志里面没有发现对应的请求,注意access_log的日志是否被屏蔽了。
  • ^~ 明确表示"前缀优先",这种匹配方式仅次于nginx的完全匹配;
相关推荐
Cao_Ron25 分钟前
用 ECharts graph 画出卡片式矩形节点
前端
skiyee34 分钟前
换个底座的 Wot Starter 居然让 AI 更懂项目!
前端·ai编程
anyup40 分钟前
这一套绝了!AI 大模型写故事,星云 SDK 驱动 3D 数字人实时演绎
前端·人工智能·aigc
耀耀切克闹灬1 小时前
短链跳转
前端
孟陬1 小时前
高质量全方位的 AI 工具 sse-stuntman — Mock SSE 接口
前端·node.js·openai
Cao_Ron1 小时前
给 ECharts 6 graph 节点叠加角标:从原理到性能优化
前端
WebGirl1 小时前
内网穿透方式
前端
hoLzwEge2 小时前
前端项目的基石:深入解读 package.json 的作用与核心配置
前端·前端框架
奇奇怪怪的2 小时前
Agentic RAG:Agent 驱动的自主检索
前端
陆枫Larry2 小时前
页面接口换图后不刷新,刷新页面后才看得到新图
前端