Как перенаправить трафик с Http на Https в Phoenix Elixir для SSL на балансировщик нагрузки?

Мне нужно перенаправить трафик с Http на Https, SSL находится на балансировщике нагрузки, поэтому все, что мне нужно сделать, это переслать заголовок с помощью plug_ssl так по моему prod.exs Я добавил:

config :web, Web.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto]]

в моем prod.exs и удалите все остальное на config :web, Web.Endpoint

Не работает

Что я делаю неправильно?

Нужно ли ставить force_ssl в моем router?

Заранее спасибо.

2 ответа

Вам, вероятно, нужно будет включить force_ssl подключайте только для ваших конечных точек, которые не используются для проверки работоспособности или чего-то связанного с этим.

У меня была похожая проблема с K8S Ingress на 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и всегда проверяйте заголовки для ваших запросов и ответов при выполнении тестов.

Обычно Healthchecker вызывает ваш сервер напрямую, используя локальную сеть, а не домен, в котором находится ваше приложение. Таким образом, вы можете поместить свой локальный адрес в exclude вариант.

Вот что я сделал:

config :my_app, MyApp.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto], exclude: ["localhost", "${IP_ADDRESS}"]],

куда IP_ADDRESS Я получил из переменной environement (это зависит от вашего типа развертывания от того, как вы его получаете) с помощью distillery, Однако, когда вы не используете distillery Вы можете просто получить переменные окружения следующим образом:

config :my_app, MyApp.Endpoint,
  force_ssl: [rewrite_on: [:x_forwarded_proto], exclude: ["localhost", System.get_env("IP_ADDRESS")]],
Другие вопросы по тегам