Проблема
Я не смог настроить правильное перенаправление с HTTP на HTTPS для правильной работы при публикации приложения в App Engine.
Когда я захожу на веб-сайт в примере .com сайт перенаправлен на http://www.example.com и показывает, что соединение незащищено.Когда я захожу на сайт через https://www.example.com, сайт корректно защищается с помощью управляемого Google SSL.Однако автоматическое перенаправление с HTTP на HTTPS не происходит.
Я также получил ошибку в Log Viewer, предупреждающую о том, что Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddlewareНе удалось определить порт HTTPS для перенаправления.
Я следовал документации MSDN и получал ее только локально, но не когдаприложение опубликовано в App Engine.https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-2.1&tabs=visual-studio
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory logger)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseStatusCodePages();
app.UseExceptionHandler("/Error");
app.UseHsts(); // This was added by the template
}
app.UseHttpsRedirection(); // This was added by the template
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc();
}
Вот Program.cs.В основном по умолчанию из шаблона проекта
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.CaptureStartupErrors(true)
.UseStartup<Startup>();
}
app.yaml, использованный для развертывания
runtime: aspnetcore
env: flexible
automatic_scaling:
min_num_instances: 1
max_num_instances: 20
cpu_utilization:
target_utilization: 0.8
readiness_check:
path: "/readinesscheck"
check_interval_sec: 5
timeout_sec: 4
failure_threshold: 2
success_threshold: 2
app_start_timeout_sec: 300
liveness_check:
path: "/livenesscheck"
check_interval_sec: 30
timeout_sec: 4
failure_threshold: 2
success_threshold: 2
skip_files:
- node_modules/
- wwwroot/src/vendor/
- ^(.*/)?.*\.pdb$
- ^(.*/)?.*\.log$
Я попробовал следующее (только по одному за раз)
- AddHttpsRedirection Middleware для метода ConfigureServices.
Что привело к недоступности приложения (502 Ошибка сервера).
services.AddHttpsRedirection(options =>
{
options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
options.HttpsPort = 443;
});
Добавить переменную среды в app.yaml
В результате приложение было недоступно (ошибка 502 сервера).
env_variables:
ASPNETCORE_HTTPS_PORT: "443"
Ручная настройка HTTPS-порта в Program.cs
Кроме того, в результате приложение стало недоступным (502 Ошибка сервера).
WebHost.CreateDefaultBuilder(args)
.UseSetting("https_port", "8080") // also return 502 when port is 443
Настройте ForwardedHeaderOptions в методе ConfigureServices и используйте ForwardedHeaderOptions в методе Configure.
https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1#other-proxy-server-and-load-balancer-scenarios Приложение доступно, но без автоматического перенаправления HTTP / HTTPS.
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
app.UseForwardedHeaders();
Предоставление доступа к портам 443 и 8080 в Dockerfile.
Приложение доступно, но без автоматического перенаправления HTTP / HTTPS.Я понимаю, что когда время выполнения в app.yaml установлено на aspnetcore .Процесс публикации автоматически сгенерировал свой собственный Dockerfile, который используется для развертывания приложения в App Engine.
EXPOSE 443
EXPOSE 8080