Http 到 Https 重定向不适用于 GCP App Engine Flex 上的 ASP NET Core 3.1 应用程序

Http to Https redirect not working for ASPNET Core3.1 app on GCP App Engine Flex

我已经在 flex 环境中的 Google 的 App Engine 上部署了一个 ASPNET Core 3.1 应用程序。该应用程序仍然可以通过 HTTP 和 HTTPS 访问。我想将所有 HTTP 请求重定向到 HTTPS。在许多地方阅读 GCP App Engine 上的应用程序应该在应用程序级别配置以处理 http 重定向我已经尝试 Microsoft.AspNetCore.Rewrite 但它会 return 一次重定向太多该应用程序部署在 App Engine 上。当不使用重写器时,它将使应用程序可以在两种协议上访问。我什至按照指示 here 尝试了自定义中间件,但它又会 return 太多重定向。请告诉我哪里错了,我该如何解决。非常感谢。

Startup.cs

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddRazorPages();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                //app.UseHttpsEnforcement();
                //var options = new RewriteOptions().AddRedirectToHttps(301, 443);
                //app.UseRewriter(options);
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.              
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();

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

自定义中间件

public static class AppBuilderExtensions
    {
        public static IApplicationBuilder UseHttpsEnforcement(this IApplicationBuilder app)
        {
            if (app == null)
            {
                throw new ArgumentNullException(nameof(app));
            }
            return app.UseMiddleware<EnforceHttpsMiddleware>();
        }
    }
 public class EnforceHttpsMiddleware
    {
        private readonly RequestDelegate _next;

        public EnforceHttpsMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            HttpRequest req = context.Request;
            if (req.IsHttps == false)
            {
                string url = "https://" + req.Host + req.Path + req.QueryString;
                context.Response.Redirect(url, permanent: true);
            }
            else
            {
                await _next(context);
            }
        }
    }

app.yaml

runtime: aspnetcore 
env: flex

manual_scaling:
  instances: 1

resources:
  cpu: 1
  memory_gb: 1
  disk_size_gb: 10

幸运的是我能够解决它。该应用程序需要一些配置才能正确理解请求。请参阅 Natthapol Vanasrivilai 的回答 。该解决方案针对 NET Core 2.1,但事实证明它也适用于 NET Core 3.1。