1&1 Windows主机子文件夹部署ASP.NET Core与Angular应用方案
可行性结论
你规划的子文件夹部署方案完全可行,不需要IIS应用创建权限,仅通过调整web.config路由规则和ASP.NET Core启动配置即可实现。
子文件夹部署失效的核心原因有两点:
- 根目录应用的默认路由规则拦截了子文件夹路径的请求,没有转发给子目录应用处理
- 子目录部署的ASP.NET Core应用未配置匹配的路径基址,导致控制器路由、静态资源路径匹配失败
推荐部署方案(根目录放Angular前端,/api子目录放Web API)
这个结构完全匹配你的访问规则,配置成本最低,按以下步骤操作即可:
1. 根目录Angular应用配置
如果根目录部署的是纯Angular静态站点:
- 构建Angular项目时保持
base href="/"配置不变,确保静态资源路径正常 - 在根目录添加
web.config文件,配置URL重写规则,将/api开头的请求直接放行到子目录,其余请求交给Angular前端路由处理,配置示例:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <rewrite> <rules> <!-- 放行API请求,不做前端路由重写 --> <rule name="SkipApi" stopProcessing="true"> <match url="^api/(.*)" /> <action type="None" /> </rule> <!-- Angular前端路由重写规则 --> <rule name="AngularRoutes" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="/" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
如果根目录部署的是集成Angular的ASP.NET Core应用,除了上述重写规则,还需要在web.config的aspNetCore节点前添加规则,确保/api请求不会被根应用的ASP.NET Core模块拦截。
2. /api子目录Web API配置
首先修改API项目的启动代码,在所有中间件注册最前面添加路径基址配置,让框架自动剥离/api前缀匹配控制器路由,不需要修改任何现有控制器的Route特性:
// Program.cs (.NET 6+ 顶级语句模板) var builder = WebApplication.CreateBuilder(args); // 其他服务注册代码... var app = builder.Build(); // 这行必须放在所有中间件最前面 app.UsePathBase("/api"); // 其他中间件配置(UseHttpsRedirection、UseRouting、UseAuthorization、MapControllers等)保持不变 app.MapControllers(); app.Run();
然后在/api子目录下放置发布后的API文件,同时修改子目录下的web.config,先清除继承自根目录的重写规则,再配置ASP.NET Core模块处理请求,核心配置示例:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <!-- 清除根目录继承的规则,避免冲突 --> <rewrite> <rules> <clear/> </rules> </rewrite> <handlers> <remove name="aspNetCore"/> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified"/> </handlers> <aspNetCore processPath="dotnet" arguments=".\你的Api项目Dll名称.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"/> </system.webServer> </configuration>
注意:1&1 Windows商务主机默认已经配置好ASP.NET Core运行时,不需要自行上传dotnet运行时,
processPath保持dotnet即可。
3. 验证注意点
- Angular项目中发起API请求时使用相对路径
/api/xxx即可,不需要额外配置跨域 - 两个项目发布时选择框架依赖模式即可,不需要打包独立运行时,可大幅减小发布文件体积
- 如果出现500错误,可以临时把两个项目web.config里的
stdoutLogEnabled设为true,查看生成的日志排查问题
替代方案
如果配置web.config遇到难以排查的权限或规则冲突问题,推荐使用更简单的二级域名方案:
- 根域名
myDomain.com绑定Angular前端应用,部署在根目录 - 新增二级域名
api.myDomain.com绑定Web API应用,部署在主机分配的二级域名对应根目录 - 两个应用都按单应用根目录部署的方式配置即可,不需要修改路径基址、不需要编写复杂的重写规则,几乎不会出现部署冲突,是共享主机部署多应用的最稳妥方案。
你提到的另一种「根目录放API、子目录放Angular」的结构也可以实现,但需要额外配置静态资源路径、前端路由重写规则,出错概率更高,不推荐使用。
内容的提问来源于stack exchange,提问作者Alex Ibrahim Ojea
相关产品推荐
相关产品推荐

