如何让 Phoenix 处理多个域?

Dum*_*nri 1 elixir phoenix-framework

凤凰城的 Web 应用程序。Nginx 用作反向代理。

目前,与往常一样,Web 应用程序处理单个域的请求。如果我将其他域的 DNS 指向同一服务器,我需要更改什么才能让我的 Phoenix 应用程序处理这些域的请求?

服务器上的 Web 应用程序将保留在单个实例中。并且它将可以通过多个域进行访问。不会重定向到主域 - 每个域都会像主域一样处理请求。

Qqw*_*qwy 6

配置 Phoenix 应用程序将使用的主机的位置位于Phoenix.Endpoint.

Phoenix.Endpoint需要更改三个配置字段的默认值:

  • url: [host: ...]这应该是在 url 帮助程序或重定向中使用的后备主机名。请注意,每当您将conn(或socket) 传递给 URL 帮助程序时,它将使用那里的字段。
  • check_origin:
    • 如果设置为 true(这是默认值),Phoenix 将拒绝请求,其标头origin要求主机名不等于url: [host: ...]上述字段。
    • 如果设置为主机名列表,它将接受任何列出的主机名。如果您有一组固定的多个主机名,这就是您想要的。每个主机名字符串都支持通配符(例如,您可以使用 匹配任何子域*.example.com
    • 如果设置为 false,则禁用来源检查。这“总是有效”,但会带来安全风险。(跨站点 WebSocket 劫持攻击)因此请考虑将其作为最后的选择。仅当应用程序的主机名动态更改时才使用此选项(如果这样做,请确保在代码中的其他位置进行自己的来源检查)。
  • force_ssl: [host: ...]默认情况下,任何传入的 HTTP 请求都会重定向到此处设置的主机名。如果host:此选项列表中缺少该字段,则默认读取url: [host: ...]上述内容。如果您显式将其设置为host: nil,则默认使用 HTTP 请求中使用的主机名。请注意,如果您在反向代理中处理 SSL,则不需要此步骤,因为在这种情况下到达 Phoenix 的所有流量都将是 HTTP。

你最终可能会得到这样的结果:

# in config/runtime.exs (in ancient Elixir/Phoenix versions: config/prod.exs)
config :my_app, MyAppWeb.Endpoint,
  url: [host: "mydomain1.com", port: 443, scheme: "https"],
  force_ssl: [host: nil],
  check_origin: [
    "https://mydomain1.com",
    "https://mydomain2.com",
    "https://*.mydomain3-and-all-its-subdomains.com",
  ]
Run Code Online (Sandbox Code Playgroud)

Phoenix 文档中的 Phoenix.Endpoint 配置部分