我需要将流量从Http转发到Https,SSL在负载均衡器上,所以我需要做的就是使用plug_ssl
转发标头,所以在prod.exs
我添加了:< / p>
config :web, Web.Endpoint,
force_ssl: [rewrite_on: [:x_forwarded_proto]]
在我的prod.exs
中删除config :web, Web.Endpoint
它不起作用。
我做错了什么?
我是否需要将force_ssl
放入router
?
提前谢谢。
答案 0 :(得分:0)
您可能需要仅为未用于运行状况检查的端点或与其相关的端点启用force_ssl
插件。
我在GKE上的k8s Ingress遇到了类似的问题,解决方法是仅将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
,并在执行测试时始终检查请求和响应的标头。
答案 1 :(得分:0)
通常,运行状况检查程序直接使用本地网络而不是应用程序所在的域来调用服务器。这样,您可以将本地地址放入exclude
选项中。
这就是我所做的:
config :my_app, MyApp.Endpoint,
force_ssl: [rewrite_on: [:x_forwarded_proto], exclude: ["localhost", "${IP_ADDRESS}"]],
使用IP_ADDRESS
从环境变量(取决于您的部署类型以及获取方式)中获取的distillery
。但是,当您不使用distillery
时,您可以通过以下方式获取环境变量:
config :my_app, MyApp.Endpoint,
force_ssl: [rewrite_on: [:x_forwarded_proto], exclude: ["localhost", System.get_env("IP_ADDRESS")]],