Nginx 子路径部署静态站点:root 与 alias 的差别,以及 404 的三种排查路径
先说结论
把静态页挂到子路径,只有两种情况:
- 用
root:请求/tools/demo/a.html映射到<root>/tools/demo/a.html - 用
alias:请求/tools/demo/a.html映射到<alias>/a.html
选错一个,就是 404。
两种写法
root 版本:
server {
listen 80;
server_name example.com;
location /tools/demo/ {
root /var/www/site;
index index.html;
try_files $uri $uri/ =404;
}
}
对应磁盘结构必须是:
/var/www/site/tools/demo/index.html
alias 版本:
location /tools/demo/ {
alias /var/www/site/demo/;
index index.html;
try_files $uri $uri/ =404;
}
磁盘结构变成:
/var/www/site/demo/index.html
三个必踩的坑
坑一:结尾斜杠
location /tools/demo/ 和 location /tools/demo 是两个不同的 location,前者要求 URL 带尾斜杠,访问不带斜杠会失配。alias 的尾斜杠更是强制的:
alias /var/www/site/demo; # 错
alias /var/www/site/demo/; # 对
漏了斜杠,nginx 会把 /tools/demo/a.html 拼成 /var/www/site/demoa.html。
坑二:try_files 和 alias 混用
try_files 放在 alias 块里,部分版本会丢掉 alias 的路径前缀,直接硬 404。稳妥做法是 alias 块不用 try_files:
location /tools/demo/ {
alias /var/www/site/demo/;
index index.html;
error_page 404 /tools/demo/index.html;
}
一定要用 try_files,就换成 root 写法。
坑三:权限
nginx worker 通常以 nginx 或 www-data 身份运行。路径上只要有一级是 700,或者是没开 o+x 的家目录,外部看到的就是 403 而不是 404。
namei -l /var/www/site/demo/index.html
namei -l 会把每一级权限列出来,比 ls 更快定位问题。
404 的排查顺序
第一步,确认端口和进程
ss -tlnp | grep ":80"
没有监听就先解决服务本身,别去动配置。
第二步,确认配置真的生效
nginx -t
nginx -s reload
nginx -t 通过不等于生效,reload 失败会保留旧 worker。reload 后盯日志:
tail -f /var/log/nginx/error.log
出现 open() failed 这类行,alias 少斜杠的问题就暴露了。
第三步,从外部验证
curl -sI http://<公网IP>/tools/demo/index.html
只在本机 curl localhost 成功不算数,安全组和防火墙可能拦在外面。
小结
- 子路径 + root:URL 路径要原样出现在磁盘上
- 子路径 + alias:URL 前缀被替换成 alias 目录,尾斜杠必须写
- alias 里别用 try_files
- 排查顺序:端口 → 配置与日志 → 权限 → 外部验证
ss -tlnp 和 namei -l 这两条命令,能省掉大部分猜测。
- 点赞
- 收藏
- 关注作者
评论(0)