You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅为启用HTTPS的部分子域名配置HSTS

仅为HTTPS子域名租户启用HSTS的.NET + IIS实现方案

由于你的多租户架构中,子域名分HTTPS和HTTP两种状态,不能在根域名配置带includeSubDomains的HSTS,否则会导致HTTP租户无法访问。核心解决思路是针对单个HTTPS子域名租户,在其请求返回时单独添加HSTS响应头,利用你已有的租户SSL状态标识来触发逻辑。以下是适配.NET + IIS技术栈的具体实现方式:

一、ASP.NET代码层面实现(灵活可控)

1. .NET Core / .NET 5+ 中间件方式

在Program.cs或Startup.cs中添加自定义中间件,根据租户SSL状态动态添加HSTS头:

// 注入你的租户服务(假设已实现ITenantService接口)
var tenantService = app.Services.GetRequiredService<ITenantService>();

app.Use(async (context, next) =>
{
    var tenantHost = context.Request.Host.Host;
    var tenant = await tenantService.GetTenantByHostAsync(tenantHost);
    
    // 仅当租户启用SSL且当前请求为HTTPS时添加HSTS头
    if (tenant != null && tenant.IsSslEnabled && context.Request.IsHttps)
    {
        // max-age设为1年,可根据需求调整;如需预加载可追加 "; preload"
        context.Response.Headers["Strict-Transport-Security"] = "max-age=31536000";
    }
    
    await next();
});

2. .NET Framework Global.asax方式

在Global.asax的Application_BeginRequest事件中处理:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var request = HttpContext.Current.Request;
    var tenantHost = request.Url.Host;
    
    // 调用你的逻辑获取租户是否启用SSL
    bool isTenantSslEnabled = TenantHelper.IsSslEnabledForTenant(tenantHost);
    
    if (isTenantSslEnabled && request.IsSecureConnection)
    {
        HttpContext.Current.Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
    }
}

二、IIS URL重写模块实现(无需修改代码)

如果你不想改动业务代码,可以通过IIS URL重写模块的出站规则来实现。首先确保服务器已安装IIS URL Rewrite模块,然后在站点的web.config中添加以下配置:

<configuration>
  <system.webServer>
    <rewrite>
      <outboundRules>
        <rule name="Add HSTS for HTTPS Tenants" enabled="true">
          <!-- 匹配HSTS响应头(初始为空) -->
          <match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" />
          <conditions logicalGrouping="MatchAll">
            <!-- 条件1:当前请求为HTTPS -->
            <add input="{HTTPS}" pattern="ON" />
            <!-- 条件2:根据你的租户标识判断(示例用自定义请求头传递SSL状态,可替换为你的判断方式) -->
            <add input="{HTTP_X_TENANT_SSL_ENABLED}" pattern="true" />
          </conditions>
          <!-- 写入HSTS头 -->
          <action type="Rewrite" value="max-age=31536000" />
        </rule>
      </outboundRules>
    </rewrite>
  </system.webServer>
</configuration>

关键注意事项

  • 绝对不要在根域名example.com的站点配置带includeSubDomains的HSTS,否则会强制所有子域名使用HTTPS,导致HTTP租户无法访问。
  • HSTS头仅作用于当前子域名,不会影响其他子域名,符合你的多租户隔离需求。
  • 如果计划将租户加入浏览器HSTS预加载列表,需要在头中追加; preload,但必须确保该租户长期支持HTTPS,不会切换回HTTP。
  • 务必保证租户SSL状态的判断逻辑准确,避免误给HTTP租户添加HSTS头,导致用户无法访问该租户。

内容的提问来源于stack exchange,提问作者Nasser Hadjloo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:42:34