You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core部署至AWS Ubuntu 18后静态资源加载404求助

排查.NET Core部署到AWS Ubuntu后静态资源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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:44:15