【问题标题】:How can I get the "base url" of a Phoenix app?如何获取 Phoenix 应用程序的“基本 url”?
【发布时间】:2017-07-27 01:00:18
【问题描述】:

当我在本地运行我的 Phoenix 应用程序时,所有请求的基本 URL 类似于 http://localhost:4000。在生产中,它类似于https://example.com/

我想将此基本 URL 传递给我的 JavaScript。我怎样才能得到它?

注意:

  • 我不想检查conn;这是我想在编译或启动期间而不是在请求时设置的内容。
  • 我知道我可以检查Application.get_env(:myapp, MyApp.Endpoint)[:url][:host] %,但这不包括方案(httphttps)或端口。如果我必须从几个地方拼凑起来,我可能可以,但我宁愿不这样做。

【问题讨论】:

  • 也许这并不简单,因为正如 dev.exs 中生成的评论所说,“如果需要,http:https: 密钥都可以配置为同时运行 http 和 https 服务器不同的端口”?
  • Phoenix 本身使用 Endpoint 配置和 Elixir 的内置 URI 模块构建 URL:github.com/phoenixframework/phoenix/blob/…

标签: elixir phoenix-framework


【解决方案1】:

您可以使用MyApp.Endpoint.url()

该链接指向 1.3 文档,因为它记录了应用程序的 Endpoint 中生成的所有函数作为回调,但该函数至少从 1.2 开始可用(我之前没有检查过)。

【讨论】:

  • 这是否依赖于您的配置文件?例如你需要设置这样的东西才能让它工作:``` config :example, Example.Endpoint, url: [host: "example.com", port: 80, scheme: "https"] ``
  • 这可行,但如果应用程序在某些反向代理之后运行,例如Nginx 或 HAProxy 可能会出现问题。猜猜在这种情况下唯一的方法是在应用程序配置中手动添加一个变量来记录“真实”的 URL?或者为此使用系统环境变量。
【解决方案2】:

使用路径助手

哎呀,有一个明显的解决方案。 :)

MyApp.Router.Helpers.page_url(MyApp.Endpoint, :index)

为此使用特定的命名路由感觉有点尴尬,但它确实有效。不过,我愿意接受更语义化的解决方案。

【讨论】:

  • 请注意,在最新的 Phoenix 中,它将是 MyAppWeb 而不是 MyApp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 2019-12-22
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多