【问题标题】:RewriteUrl in Phoenix / Plug / Cowboy?在 Phoenix / Plug / Cowboy 中重写 Url?
【发布时间】:2016-11-04 01:51:11
【问题描述】:

如何在phoenix中重写一个Url?
例如将所有对//www.app.com/xyz的请求重写为//app.com/xyz

是否有一个简单的选项,例如 force_ssl?有谁知道,在哪里插入?有插件选项吗?

【问题讨论】:

  • 为什么要在应用程序级别执行此操作?通常,此类重写是在 Web 服务器级别的配置上完成的。
  • true,在这种情况下,cowboy 是我的顶级服务器,没有其他反向代理,thanx
  • 那么你可能想使用Cowboy routing。当我说“为什么在应用程序级别”时,我的意思是 Plug 在应用程序内部太深了,无法完成此类任务。
  • 是的,我很高兴,但我有点困惑如何使用牛仔路由来做到这一点。能举个小例子吗?

标签: elixir phoenix-framework cowboy plug


【解决方案1】:

使用自定义插件

您可以编写自定义Plug 来处理您的场景。这是一个例子:

defmodule MyApp.Plugs.RewriteURL do
  import Plug.Conn
  import Phoenix.Controller

  @redirect_from "www.app.com"
  @redirect_to   "app.com"

  def init(default), do: default

  def call(%Plug.Conn{host: host, port: port, request_path: path} = conn, _) do
    if host == @redirect_from do
      conn
      |> redirect(external: "http://#{@redirect_to}:#{port}#{path}")
      |> halt
    else
      conn
    end
  end
end

现在只需将它添加到web/router.ex 中的管道顶部:

pipeline :browser do
  plug MyApp.Plugs.RewriteURL
  plug :accepts, ["html"]

  # Other plugs...
end

这是一个基本的概念证明,但应该适用于大多数情况。

您必须根据您的确切要求修改此代码,因为它缺少某些功能。例如,它不会将请求的 queryparams 传递给重定向的 URL。它还执行基本重定向,因此如果您想保留原始请求方法而不将其更改为 GET,则可以考虑使用 307 redirect

【讨论】:

  • 看起来不错,看看有没有其他更通用的方法
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2013-07-08
  • 2016-03-04
相关资源
最近更新 更多