静态资源服务器 - 80 端口
server {
listen 80;
server_name localhost;
charset utf-8;
charset_types text/css application/javascript text/plain text/xml application/json;
项目部署根目录
root /Users/yupi/Code/yu-ai-code-mother/tmp/code_deploy;
# 处理所有请求
location ~ ^/([^/]+)/(.*)$ {
try_files /$1/$2 /$1/index.html =404;
}
}
解释一下这段代码
你想要我解释这段 Nginx 配置代码的含义,它本质上是一个监听 80 端口、支持多项目的静态资源服务器配置,尤其适配前端单页应用(SPA)的路由规则,我会逐行拆解并说明核心逻辑。
一、代码整体功能总结
这段配置定义了一个 Nginx 的server(虚拟主机),作用是:
- 监听本地 80 端口,提供静态资源访问服务;
- 以
/Users/yupi/Code/yu-ai-code-mother/tmp/code_deploy为根目录托管静态文件; - 支持 "多项目" 目录结构(每个子目录对应一个前端项目),并适配前端 SPA 的 history 路由模式(非真实文件路径自动指向项目的
index.html); - 确保各类静态文件(CSS/JS/JSON 等)的 UTF-8 编码,避免乱码。
二、逐行详细解释
nginx
# 静态资源服务器 - 80 端口
server {
# 1. 监听80端口(HTTP协议默认端口)
listen 80;
# 2. 匹配的访问域名/主机名:仅响应localhost(本地访问)的请求
server_name localhost;
# 3. 设置全局响应的默认字符编码为UTF-8,解决中文乱码基础问题
charset utf-8;
# 4. 明确指定哪些MIME类型的文件使用UTF-8编码(覆盖Nginx默认值)
# 确保CSS/JS/文本/XML/JSON这类文件返回时编码正确
charset_types text/css application/javascript text/plain text/xml application/json;
# 5. 静态资源的根目录:所有文件请求都会基于这个路径查找
root /Users/yupi/Code/yu-ai-code-mother/tmp/code_deploy;
# 6. 核心:匹配URL路径的规则(正则匹配)
# ~ 表示区分大小写的正则匹配;^/([^/]+)/(.*)$ 是正则表达式,拆解如下:
# ^/ :URL以 / 开头
# ([^/]+) :第一个捕获组($1),匹配"/"后、下一个"/"前的所有非/字符(比如项目名)
# / :匹配第二个 /
# (.*) :第二个捕获组($2),匹配剩下的所有字符(比如文件路径/路由路径)
# 示例:请求 /project1/page/index.html → $1=project1,$2=page/index.html
# 示例:请求 /admin/dashboard → $1=admin,$2=dashboard
location ~ ^/([^/]+)/(.*)$ {
# 7. try_files:按顺序检查文件/目录是否存在,核心逻辑是"适配前端SPA路由"
# 第一步:检查 根目录/$1/$2 是否存在(比如 /project1/page/index.html)
# 第二步:如果不存在,尝试访问 根目录/$1/index.html(项目的入口文件)
# 第三步:如果都不存在,返回404错误
try_files /$1/$2 /$1/index.html =404;
}
}
三、实际请求示例(帮你理解执行逻辑)
假设你的root目录结构如下:
plaintext
/code_deploy/
├─ project1/ # 项目1目录
│ ├─ index.html # 项目1的SPA入口
│ └─ static/
│ └─ app.js
└─ admin/ # 管理后台项目
└─ index.html # 管理后台SPA入口
-
请求真实静态文件 :
http://localhost/project1/static/app.js- 正则捕获:1=project1,2=static/app.js
- try_files 检查:
/project1/static/app.js存在 → 直接返回该文件。
-
请求前端路由路径(非真实文件) :
http://localhost/admin/dashboard- 正则捕获:1=admin,2=dashboard
- try_files 检查:
/admin/dashboard不存在 → 尝试访问/admin/index.html(存在)→ 返回该文件,由前端路由处理/dashboard路径。
-
请求不存在的项目 / 文件 :
http://localhost/test/123- 正则捕获:1=test,2=123
- try_files 检查:
/test/123不存在 → 尝试/test/index.html也不存在 → 返回 404 错误。
总结
- 核心作用:搭建 80 端口的静态资源服务器,支持多项目托管,适配前端 SPA 的 history 路由模式;
- 关键指令 :
root指定资源根目录,location正则匹配多项目路径,try_files实现 "文件优先、路由回退到 index.html"; - 编码保障 :
charset和charset_types确保各类静态文件 UTF-8 编码,避免乱码。
如果你的前端项目(Vue/React)部署后刷新页面 404,这个配置就是典型的解决方案,核心是try_files把非文件请求转发到index.html。