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服务

正常访问:

相关推荐
苏三的开发日记17 分钟前
windows系统搭建kafka环境
后端
爬山算法27 分钟前
Netty(19)Netty的性能优化手段有哪些?
java·后端
Tony Bai28 分钟前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
想用offer打牌41 分钟前
虚拟内存与寻址方式解析(面试版)
java·后端·面试·系统架构
無量1 小时前
AQS抽象队列同步器原理与应用
后端
9号达人1 小时前
支付成功订单却没了?MyBatis连接池的坑我踩了
java·后端·面试
用户497357337982 小时前
【轻松掌握通信协议】C#的通信过程与协议实操 | 2024全新
后端
草莓熊Lotso2 小时前
C++11 核心精髓:类新功能、lambda与包装器实战
开发语言·c++·人工智能·经验分享·后端·nginx·asp.net
追逐时光者2 小时前
精选 8 个 .NET 开发实用的类库,效率提升利器!
后端·.net
a程序小傲3 小时前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·后端·postgresql·面试·职场和发展