.NET 7.0如何根据请求主机动态设置WebRootPath并提供静态文件
解决.NET 7.0根据子域名动态提供静态文件的问题
不需要修改WebRootPath(该属性是启动时确定的,运行时无法动态修改),可以通过前置中间件修改请求路径的方式,让静态文件中间件自动匹配对应子域名的文件夹,具体实现如下:
实现步骤
- 保持默认
WebRootPath指向wwwroot,无需额外配置 - 添加前置中间件,提取请求的Host,验证对应文件夹存在
- 修改请求路径,将Host作为前缀添加到原路径前
- 启用默认文档和静态文件中间件,处理修改后的路径
完整Program.cs代码示例
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 前置中间件:根据请求Host动态调整路径 app.Use(async (context, next) => { var host = context.Request.Host.Host; var targetDirectory = Path.Combine(app.Environment.WebRootPath, host); // 检查对应子域名文件夹是否存在,不存在返回404 if (!Directory.Exists(targetDirectory)) { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.WriteAsync($"Subdomain {host} not found"); return; } // 修改请求路径,将Host作为前缀拼接 context.Request.Path = $"/{host}{context.Request.Path}"; await next(); }); // 配置默认文档(如index.html) app.UseDefaultFiles(new DefaultFilesOptions { DefaultFileNames = new List<string> { "index.html" } }); // 启用静态文件服务 app.UseStaticFiles(); app.Run();
说明
- 当请求
https://folder1.abc.com时,中间件会将路径修改为/folder1.abc.com/,静态文件中间件会自动从wwwroot/folder1.abc.com目录加载index.html - 对于子域名下的静态资源(如
https://folder1.abc.com/css/style.css),路径会被修改为/folder1.abc.com/css/style.css,对应加载wwwroot/folder1.abc.com/css/style.css - 若请求的子域名文件夹不存在,会直接返回404及提示信息,避免无效路径遍历
内容的提问来源于stack exchange,提问作者stack overflow
相关产品推荐
相关产品推荐

