Nginx部署.NET+Angular应用根路径返回404其余路径正常
根路径404问题修复方案
问题原因
你的配置存在三个核心问题:
index指令错误使用了绝对路径,Nginx的index参数只需要写相对于root目录的文件名,写绝对路径会导致路径拼接错误- 全量请求都被
location /转发给了5000端口的.NET服务,没有给Nginx处理静态首页的机会,而.NET端也没有配置根路径到index.html的默认映射 - 注释掉了Angular单页应用必需的
try_filesfallback规则,后续即使解决根路径问题,前端子路由刷新也会报404
修复步骤
1. 调整Nginx配置
将对应server块修改为如下内容,核心逻辑是:静态资源由Nginx直接从Angular打包目录读取,后端接口请求转发给.NET服务,不存在的路径统一fallback到index.html交给Angular路由处理:
server { listen *:80; listen 443 ssl; server_name v2202207178565194475.supersrv.de *.supersrv.de; # root直接指向Angular打包后的wwwroot目录,index只写文件名 root /var/www/donau_lead_generator/donau-lead-generator/bin/Release/net6.0/publish/wwwroot; index index.html; location / { # 优先匹配物理文件,找不到就返回index.html,接口请求转给.NET后端 try_files $uri $uri/ /index.html @dotnet_backend; } # .NET后端转发规则 location @dotnet_backend { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ssl_certificate /etc/letsencrypt/live/v2202207178565194475.supersrv.de/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/v2202207178565194475.supersrv.de/privkey.pem; # HTTP转HTTPS规则 if ($scheme != "https") { return 301 https://$host$request_uri; } }
如果你的项目没有用独立
/api前缀区分前后端请求,不想拆分静态和反代逻辑,也可以直接在.NET端补默认首页配置,见第二步。
2. 补全.NET端静态文件配置(可选,全反代场景必选)
如果你不想让Nginx处理静态文件,坚持全量请求转发给.NET,就去项目的Program.cs(旧版本是Startup.cs)里,在路由配置前添加静态文件和默认首页中间件:
// 注意顺序,要放在路由、鉴权等中间件之前 app.UseDefaultFiles(); app.UseStaticFiles(); // 其他原有中间件配置:app.UseRouting()、app.UseAuthorization()等 // ... // 最后加fallback规则,让所有前端路由都返回index.html app.MapFallbackToFile("index.html");
修改完之后重新执行发布命令即可:
dotnet publish --configuration Release
3. 重载服务生效
先校验Nginx配置合法性,再重载配置:
nginx -t # 输出test is successful后执行重载 nginx -s reload
如果改了.NET代码,重启对应的.NET服务即可。
内容的提问来源于stack exchange,提问作者Eduard Frankford
相关产品推荐
相关产品推荐

