对 ASP.NET Core Kestrel Web 服务器使用主机筛选
尽管 Kestrel 支持基于前缀的配置(例如 http://example.com:5000
),但 Kestrel 在很大程度上会忽略主机名。 主机 localhost
是一个特殊情况,用于绑定至环回地址。 除了显式 IP 地址以外的所有主机都绑定至所有公共 IP 地址。 不验证 Host
标头。
解决方法是,使用主机筛选中间件。 由调用 AddHostFiltering 的 CreateDefaultBuilder 添加中间件:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
默认情况下,主机筛选中间件处于禁用状态。 要启用该中间件,请在 appsettings.json
/appsettings.{Environment}.json
中定义一个 AllowedHosts
键。 此值是以分号分隔的不带端口号的主机名列表:
appsettings.json
:
{
"AllowedHosts": "example.com;localhost"
}
注意
转接头中间件 同样包含 AllowedHosts 选项。 转接头中间件和主机筛选中间件具有适合不同方案的相似功能。 如果未保留 Host
标头,并且使用反向代理服务器或负载均衡器转接请求,则使用转接头中间件设置 AllowedHosts
比较合适。 将 Kestrel 用作面向公众的边缘服务器或直接转接 Host
标头时,使用主机筛选中间件设置 AllowedHosts
比较合适。
有关转接头中间件的详细信息,请参阅配置 ASP.NET Core 以使用代理服务器和负载均衡器。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈