在IIS部署Angular与ASP.NET Web API到子域名,Angular报404求解决
解决方案:Angular + ASP.NET API 同域名部署404问题
问题根源
根目录web.config中配置了path="*"的ASP.NET Core handler,会拦截所有请求,但ASP.NET Core未正确配置静态文件服务来处理wwwroot中的Angular资源;同时wwwroot下的web.config因根目录location标签的inheritInChildApplications="false"设置无法生效,导致Angular路由和静态文件请求无法被正确处理。
修复步骤
1. 更新ASP.NET Core项目的Startup.cs
确保添加静态文件服务和SPA路由回退逻辑,让ASP.NET Core能正确服务Angular静态文件并处理路由回退:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); // 启用静态文件服务,默认指向wwwroot目录 app.UseStaticFiles(); app.UseRouting(); app.UseCors(); // 确保你的CORS策略已正确配置 app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); // 映射API控制器路由 }); // 配置SPA路由回退,处理Angular单页应用路由 app.UseSpa(spa => { spa.Options.SourcePath = "wwwroot"; // 生产环境下,所有非API、非静态文件的请求都重定向到index.html spa.Options.DefaultPage = "/index.html"; }); }
2. 调整根目录的web.config
修改handler路径仅拦截API请求,添加静态文件MIME类型配置和Angular路由重写规则:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <!-- 仅处理API路径的请求,静态文件由IIS直接处理 --> <add name="aspNetCore" path="api/*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\MyApi.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"> </aspNetCore> <!-- 配置Angular所需的MIME类型,避免静态文件无法识别 --> <staticContent> <mimeMap fileExtension=".json" mimeType="application/json" /> <mimeMap fileExtension=".js" mimeType="application/javascript" /> <mimeMap fileExtension=".css" mimeType="text/css" /> <mimeMap fileExtension=".html" mimeType="text/html" /> <mimeMap fileExtension=".svg" mimeType="image/svg+xml" /> <mimeMap fileExtension=".ico" mimeType="image/x-icon" /> </staticContent> <!-- 配置路由重写,处理Angular单页应用路由回退 --> <rewrite> <rules> <rule name="Angular Routes" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <!-- 排除API路径,确保API请求正常转发到ASP.NET Core --> <add input="{REQUEST_URI}" pattern="^/api/" negate="true" /> </conditions> <action type="Rewrite" url="/index.html" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
3. 删除wwwroot目录下的web.config
根目录的配置已覆盖静态文件和路由处理逻辑,子目录的web.config会导致配置冲突,直接删除即可。
额外检查点
- 确认Angular项目打包后的文件已完整复制到
wwwroot目录(包括index.html、main.*.js、styles.*.css等) - 确认服务器已安装IIS URL Rewrite模块(重写规则依赖此模块)
- 确认服务器已安装对应版本的ASP.NET Core Runtime
- 查看
logs/stdout日志,排查ASP.NET Core是否有启动或运行时错误
内容的提问来源于stack exchange,提问作者user201469
相关产品推荐
相关产品推荐

