在 Phoenix / Plug / Cowboy 中重写 Url?
RewriteUrl in Phoenix / Plug / Cowboy?
如何在 phoenix 中重写一个 Url?
例如将对 //www.app.com/xyz
的所有请求重写为 //app.com/xyz
有没有简单的选项,比如force_ssl?有谁知道在哪里插入它?有插件选项吗?
使用自定义插件
您可以编写自定义 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
这是一个基本的概念证明,但应该适用于大多数情况。
您必须根据您的具体要求修改此代码,因为它缺少一些功能。例如,它不会将请求的 query
或 params
传递给重定向的 URL。它还进行基本重定向,因此如果您想保留原始请求方法而不将其更改为 GET,您可以考虑使用 307 redirect。
如何在 phoenix 中重写一个 Url?
例如将对 //www.app.com/xyz
的所有请求重写为 //app.com/xyz
有没有简单的选项,比如force_ssl?有谁知道在哪里插入它?有插件选项吗?
使用自定义插件
您可以编写自定义 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
这是一个基本的概念证明,但应该适用于大多数情况。
您必须根据您的具体要求修改此代码,因为它缺少一些功能。例如,它不会将请求的 query
或 params
传递给重定向的 URL。它还进行基本重定向,因此如果您想保留原始请求方法而不将其更改为 GET,您可以考虑使用 307 redirect。