Nginx反向代理仅根路径可用,子路径报404问题求助
问题解决:Nginx反向代理仅根路径可访问,其余返回404
你的核心问题出在try_files $uri $uri/ =404这行配置上:Nginx会优先检查本地服务器是否存在请求的文件或目录,找不到就直接返回404,完全跳过了反向代理流程,所以只有根路径(本地可能存在默认首页)能正常访问,其他路径都被拦截返回404。
修改后的完整配置
将两个零散的server块合并,并移除错误的try_files指令,确保所有请求都转发到容器服务:
server { listen 80; listen [::]:80; server_name example.com; location / { # 注意:如果容器服务用HTTP而非HTTPS,这里要改成http://localhost:3030 proxy_pass https://localhost:3030; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 用default替代硬编码地址,自动适配后端返回的重定向 proxy_redirect default; } }
关键修改说明
- 合并server块:原配置拆分了两个server块,一个指定域名但未监听端口,一个监听端口但未指定域名,容易导致请求匹配混乱。合并后确保
example.com的所有80端口请求都走代理逻辑。 - 移除
try_files:反向代理场景下,除非你需要Nginx先处理本地静态资源,否则不需要这行指令——它会阻断非本地存在路径的代理流程。 - 优化
proxy_redirect:用default替代硬编码的地址,Nginx会自动替换后端返回的重定向地址中的主机和端口,适配性更强。
特殊场景适配(需本地静态资源支持)
如果项目有部分静态文件存放在Nginx服务器本地,需要优先读取本地文件再代理其他请求,可使用以下配置:
server { listen 80; listen [::]:80; server_name example.com; location / { # 先尝试本地文件/目录,找不到则转发到后端容器 try_files $uri $uri/ @proxy; } # 专门处理代理的location location @proxy { proxy_pass https://localhost:3030; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect default; } }
内容的提问来源于stack exchange,提问作者Spielcrypto
相关产品推荐
相关产品推荐

