【问题标题】:How to get the current base domain of a Phoenix app?如何获取 Phoenix 应用程序的当前基域?
【发布时间】:2020-07-28 05:30:48
【问题描述】:

为 Phoenix/Elixir 应用程序获取基域的惯用方式是什么?不是单个请求,而是应用程序的基本域,这可能取决于其当前环境。

所以本地应该是localhost,但在服务器上,它可以是“dev.my_domain.com”、“my_domain.com”或其他我可以在我的应用程序中使用的东西。

当然,我可以在config/dev.exsconfig/prod.exs 中添加一个特殊的密钥,但我认为在某个地方可能已经有这样一个我可以重复使用的密钥。

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    对于请求,您应该像@TheAnhLe 建议的那样使用Plug.Conn 中的host 字段。

    但是,如果您希望以其他方式获取域,Phoenix 允许您在应用程序 Endpoint 配置中指定 url 参数:

    # config/prod.exs
    
    config :my_app, MyAppWeb.Endpoint,
      http: [port: {:system, "PORT"}],
      url: [host: "example.com", port: 80],
      # more configs...
    

    您可以使用这些方法来获取主机的值:

    MyAppWeb.Endpoint.url()
    # => "http://localhost:4000"
    
    MyAppWeb.Endpoint.host()
    # => "localhost"
    

    未指定时,此值默认为localhost

    更新:对于 1.3 之前的 Phoenix 版本,将 MyAppWeb 替换为 MyApp

    【讨论】:

    • 对于 1.3 之前的 Phoenix 版本,没有 MyApp 与 MyAppWeb 的区别,这个答案是正确的。对于 Phoenix 的最新版本,它是 MyAppWeb.Endpoint,而不是 MyApp.Endpoint!
    【解决方案2】:

    您正在寻找host。它是存储在Plug.Conn 结构中的请求字段。

    host - 请求的主机作为二进制文件,例如:“www.example.com”

    Request Fields

    【讨论】:

    • 不是单个请求,
    【解决方案3】:

    使用phoenix 1.3.0(不知道旧版本)您可以从Endpoint API 致电url/0

    例如:

    iex(1)> TestWeb.Endpoint.url
    "http://localhost:4000"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2012-05-25
      • 2012-04-20
      • 1970-01-01
      相关资源
      最近更新 更多