Возможно, вам понадобится включить плагин force_ssl
только для ваших конечных точек, которые не используются для проверки работоспособности или чего-то связанного с этим.
У меня была похожая проблема с входом k8s на GKE иРешением было поставить force_ssl
на маршрутизаторе только для маршрутов моего приложения и разрешить /healthz
(который был настроен как мой маршрут проверки работоспособности) с использованием HTTP.
Пример config/prod.exs
:
# Tells if we need to enforce SSL for our endpoints.
# Only production/staging should enforce
config :my_app, force_ssl: true
config :my_app, MyAppWeb.Endpoint,
load_from_system_env: true,
url: [host: "${APP_HOST}", port: 80],
server: true,
http: [port: "${PORT}"],
url: [scheme: "https", host: "${APP_HOST}", port: 443],
secret_key_base: "${SECRET_KEY_BASE}"
А вот пример lib/my_app_web/router.ex
:
defmodule MyAppWeb.Router do
use MyAppWeb, :router
# This route will NOT enforce SSL
get("/healthz", MyAppWeb.HealthCheckController, :show)
pipeline :api do
plug(:accepts, ["json"])
if Application.get_env(:my_app, :force_ssl) do
plug(Plug.SSL, rewrite_on: [:x_forwarded_proto], host: nil)
end
end
scope "/", MyAppWeb do
pipe_through(:api)
# My routes will go here, and will be enforced if the
# application flag `force_ssl` is enabled.
end
end
Это немного сложно отладить.Если вы используете kubernetes
, попробуйте использовать kubectl describe ingress YOUR-INGRESS-HERE
и всегда проверяйте заголовки для ваших запросов и ответов при выполнении тестов.