您可能force_ssl
只需要为您的端点启用插件,这些端点不用于健康检查或与之相关的东西。
我在 GKE 上的 k8s Ingress 遇到了类似的问题,解决方案是只为我的应用程序路由放置force_ssl
on 路由器/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
,并在进行测试时始终检查您的请求和响应的标题。