.NET Core部署至AWS Ubuntu 18后静态资源加载404求助
看起来你已经做了不少尝试,但还是卡在静态资源加载上,咱们一步步来排查最容易忽略的几个点:
1. 确认静态文件中间件已正确配置
.NET Core不会自动处理静态文件,必须显式启用中间件。先检查你的启动代码:
- 如果是.NET 6+(Program.cs):确保
app.UseStaticFiles();这一行存在,而且位置要对——得放在app.UseRouting();之前、app.UseHttpsRedirection();之后,别被生产环境的条件判断给漏掉了(比如不小心写在if (app.Environment.IsDevelopment())里面)。示例代码应该是这样的:var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages(); // 或者你用的MVC/Controllers服务 var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); // 关键!不能少,位置要对 app.UseRouting(); app.UseAuthorization(); app.MapRazorPages(); // 或者你的路由配置 app.Run(); - 如果是.NET 5及更早(Startup.cs):检查
Configure方法里有没有app.UseStaticFiles();,同样要放在正确的顺序里。
2. 检查服务器上wwwroot的权限
AWS Ubuntu服务器上,文件权限很容易踩坑。.NET Core进程运行的用户(比如www-data,如果你用Nginx/Apache反向代理的话)必须能读取wwwroot里的文件。执行这两个命令修复权限:
sudo chown -R www-data:www-data /path/to/your/published/wwwroot sudo chmod -R 755 /path/to/your/published/wwwroot
替换/path/to/your/published为你实际的部署目录路径。权限不对的话,就算文件存在,服务器也会返回404(或者403,只是浏览器可能显示404)。
3. 修正Layout里的资源引用路径
别手动加published/wwwroot/!.NET Core的静态文件中间件默认把wwwroot作为静态资源的根目录,所以你的引用应该用根相对路径,比如:
- 正确写法:
<link rel="stylesheet" href="~/css/site.css" />或者用@Url.Content("~/css/site.css") - 错误写法:
published/wwwroot/css/site.css或者../css/site.css(相对路径容易出错)
打开浏览器开发者工具(F12),看“网络”标签里失败的请求URL——如果请求的是http://yourdomain.com/published/wwwroot/css/site.css,那明显是路径错了,要改成http://yourdomain.com/css/site.css,对应到服务器上的/path/to/published/wwwroot/css/site.css。
4. 检查反向代理配置(如果用了Nginx/Apache)
如果你用Nginx或者Apache做反向代理(AWS部署.NET Core通常会这么做),要确保静态文件请求要么被反向代理正确转发给.NET Core,要么直接由代理服务器处理:
比如Nginx的配置里,应该添加专门处理静态文件的location块:
# 处理静态文件,直接返回,不用转发给.NET Core location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ { root /path/to/your/published/wwwroot; expires 30d; } # 其他请求转发给.NET Core进程 location / { proxy_pass http://localhost:5000; # 替换成你的.NET Core端口 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; }
如果没有这个静态文件块,Nginx会把所有请求转发给.NET Core,这时候如果中间件配置没问题也能工作,但多一层转发容易出问题。另外要确保root路径指向正确的wwwroot目录。
5. 确认.NET Core进程的工作目录
如果用systemd服务管理你的.NET Core应用(生产环境常用),要检查服务文件里的WorkingDirectory是否设置为published目录。比如/etc/systemd/system/yourapp.service里的配置:
[Service] WorkingDirectory=/path/to/your/published # 必须是published目录,不是wwwroot ExecStart=/usr/bin/dotnet /path/to/your/published/YourApp.dll Restart=always RestartSec=10 User=www-data Environment=ASPNETCORE_ENVIRONMENT=Production
如果WorkingDirectory设置错了,.NET Core会在错误的目录下找wwwroot,自然找不到文件。修改后记得重启服务:sudo systemctl daemon-reload && sudo systemctl restart yourapp.service
按这个顺序排查下来,应该能找到问题所在。先从中间件和权限这两个最常见的坑开始查,大概率能解决。
内容的提问来源于stack exchange,提问作者noobCoder

