Nginx代理URL路径拼接问题(页面报404)

案例一

✅ 问题重现

文件所在位置:/usr/share/nginx/html/test/index.html

nginx配置 A(访问异常):

bash 复制代码
location /test {
    root /usr/share/nginx/html/test;
    index index.html index.htm;
}

访问 http://yourdomain.com/test → 报 404


nginx配置 B(访问正常):

bash 复制代码
location /test {
    root /usr/share/nginx/html;
    index index.html index.htm;
}

访问 http://yourdomain.com/test → 正常显示


🔍 根本原因:root 指令的路径拼接规则

📌 Nginx 的 root 是这样工作的:

root 指定的是"根目录",最终文件路径 = root 路径 + 完整的 URI

也就是说:

  • root /path/to;
  • 请求 /test
  • Nginx 实际查找的文件是:/path/to/test

❌ 为什么配置 A 报 404?

bash 复制代码
location /test {
    root /usr/share/nginx/html/test;
}

当用户访问:

arduino 复制代码
http://yourdomain.com/test

Nginx 会这样拼路径:

ruby 复制代码
root 路径: /usr/share/nginx/html/test
URI: /test
→ 实际查找文件: /usr/share/nginx/html/test/test

它去找的是 /usr/share/nginx/html/test/test 这个文件或目录!

但你实际的文件结构是:

bash 复制代码
/usr/share/nginx/html/test/index.html

所以 Nginx 找不到 /test/test,返回 404。


✅ 为什么配置 B 能正常工作?

bash 复制代码
location /test {
    root /usr/share/nginx/html;
}

请求 /test 时:

ruby 复制代码
root 路径: /usr/share/nginx/html
URI: /test
→ 查找路径: /usr/share/nginx/html/test

这正好对应你的文件:

bash 复制代码
/usr/share/nginx/html/test/index.html

所以 Nginx 找到了 index.html,返回成功 ✅


✅ 正确做法:用 alias 替代 root(推荐)

如果你希望 /test 映射到 /usr/share/nginx/html/test 目录,并且访问 /test 就显示该目录下的 index.html,应该使用 alias:

bash 复制代码
location /test {
    alias /usr/share/nginx/html/test;
    index index.html index.htm;
    try_files $uri $uri/ =404;
}

🔍 alias 的规则是:

alias 会 替换 location 匹配的部分

所以:

  • location /test
  • alias /usr/share/nginx/html/test
  • 请求 /test → 实际路径:/usr/share/nginx/html/test

完美匹配你的文件结构 ✅


✅ 总结对比

配置 实际查找路径 是否正确
root /usr/share/nginx/html/test; /usr/share/nginx/html/test/test ❌ 错了,多了一层 /test
root /usr/share/nginx/html; /usr/share/nginx/html/test ✅ 正确
alias /usr/share/nginx/html/test; /usr/share/nginx/html/test ✅ 推荐,语义清晰

✅ 推荐最终配置

bash 复制代码
server {
    listen 80;
    server_name yourdomain.com;

    location /test {
        alias /usr/share/nginx/html/test;
        index index.html index.htm;
        try_files $uri $uri/ =404;
    }

    # 其他 location...
}

✅ 验证步骤

  1. 确保文件存在:

    bash 复制代码
    ls -l /usr/share/nginx/html/test/index.html
  2. 测试 Nginx 配置:

    复制代码
    sudo nginx -t
  3. 重载 Nginx:

    复制代码
    sudo systemctl reload nginx
  4. 访问:

    arduino 复制代码
    http://yourdomain.com/test

✅ 记住一句话:

  • 用 root 时:路径是 root + URI
  • 用 alias 时:location 路径被替换为 alias 路径

所以 /test 映射到一个目录时,优先使用 alias,避免路径拼接错误。

案例二

这是我自己写node服务,carapp对应静态资源,carapi对应api服务

正常访问:

相关推荐
深蓝AI5 小时前
Python 3.13 的 Queue.shutdown:异步消费者终于能正常收工了
后端
武子康6 小时前
MultiNet6 空闲崩溃:`EXCVADDR=0x8` 后又出现 `CORRUPT HEAP`
人工智能·后端·agent
武子康7 小时前
MultiNet7 每轮都 clean,ESP32-P4 内存为什么还在掉?
人工智能·后端·agent
超级架构师7 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
陈随易8 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
IT_陈寒9 小时前
JavaScript的this坑人实录,这次我真的记下来了
前端·人工智能·后端
starzy199010 小时前
Scala类和对象:从构造器到样例类的完整指南
开发语言·后端·scala
梦影_10 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database
考虑考虑10 小时前
mariadb数据库
数据库·后端·mariadb
明月_清风10 小时前
用自然语言操控真机:Google Artemis 移动端 AI Agent 上手与实践
人工智能·后端