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

ASP.NET Core 3.1项目:UI仅支持HTTPS、API仅支持HTTP配置咨询

实现方案与代码示例

要实现UI强制HTTPS、API仅允许HTTP的需求,核心思路是通过Kestrel配置双端口监听,再用自定义中间件区分请求路径并做协议校验,具体步骤如下:

1. 配置Kestrel监听双端口

首先确保Kestrel同时监听HTTP和HTTPS端口,开发环境可保留launchSettings.json的配置,生产环境建议在Program.cs中显式配置:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>()
                .UseKestrel(options =>
                {
                    // 监听HTTP端口(示例为5000,可根据实际调整)
                    options.ListenAnyIP(5000);
                    // 监听HTTPS端口(示例为5001,生产环境需配置有效证书)
                    options.ListenAnyIP(5001, listenOptions =>
                    {
                        // Linux环境可指定PFX证书文件路径及密码
                        listenOptions.UseHttps("your-cert.pfx", "cert-password");
                        // 或使用Let's Encrypt等证书颁发机构的证书
                    });
                });
        });

2. 添加自定义协议校验中间件

移除默认的UseHttpsRedirection中间件(避免全局重定向覆盖API规则),添加自定义中间件区分UI与API请求:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // 自定义协议校验中间件(需放在路由中间件之前)
    app.Use(async (context, next) =>
    {
        var requestPath = context.Request.Path.Value?.Trim().ToLowerInvariant() ?? string.Empty;

        // 处理API请求:仅允许HTTP
        if (requestPath.StartsWith("/api"))
        {
            if (context.Request.IsHttps)
            {
                context.Response.StatusCode = StatusCodes.Status403Forbidden;
                await context.Response.WriteAsync("API接口仅支持HTTP协议访问");
                return;
            }
        }
        // 处理UI请求:强制HTTPS
        else
        {
            if (!context.Request.IsHttps)
            {
                var httpsUrl = $"https://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}";
                context.Response.Redirect(httpsUrl);
                return;
            }
        }

        await next();
    });

    app.UseRouting();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        // UI路由
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
        // API路由
        endpoints.MapControllers();
    });
}

3. 关键说明

  • 路径区分规则:示例中以/api开头的请求判定为API,可根据实际路由前缀调整;
  • 生产环境证书:Linux服务器上需配置有效的HTTPS证书,可通过openssl生成自签证书,或使用Let's Encrypt等免费证书;
  • 中间件顺序:自定义校验中间件必须放在UseRouting之前,确保请求进入路由前完成协议校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:55:15