注意
此版本不是本文的最新版本。 有关当前版本,请参阅本文的 .NET 9 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 有关当前版本,请参阅本文的 .NET 9 版本。
尽管 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 以使用代理服务器和负载均衡器。