Nginx 子路径部署静态站点:root 与 alias 的差别,以及 404 的三种排查路径

举报
yd_210957517 发表于 2026/10/23 17:48:43 2026/10/23
【摘要】 先说结论把静态页挂到子路径,只有两种情况:用 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.c...

先说结论

把静态页挂到子路径,只有两种情况:

  • 用 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 这两条命令,能省掉大部分猜测。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。