路由到phoenix-framework中的静态页面

时间:2015-04-28 12:12:15

标签: elixir phoenix-framework

我想为我的网站运行一个带有凤凰后端的angularJS前端。我希望我的根路由将用户引导到包含我的角度客户端的静态目录中的预构建页面,然后使用phoenix运行API。我过去通过像这样的路线匹配在轨道上用红宝石完成了这个:

get '/', to: redirect('/foobar.html')  

有没有办法和凤凰做类似的事情?

3 个答案:

答案 0 :(得分:6)

现在不行。您需要创建一个控制器,然后在控制器中:

defmodule MyApp.RootController do
  use MyApp.Web, :controller

  plug :action

  def index(conn, _params) do
    redirect conn, to: "/foobar.html"
  end
end

答案 1 :(得分:2)

在生产中,许多人在他们的应用程序中使用nginx或其他服务器,这些服务器应该处理静态资产。可以使用位置规则来查找索引,例如:

location / {
    try_files $uri $uri/index.html @proxy;
}

否则,这是一个解决方案,使用一个简短的函数插件将请求映射到index.html的根路径,该插件可以添加到endpoint.ex而不涉及控制器:

def redirect_index(conn = %Plug.Conn{path_info: []}, _opts) do
    %Plug.Conn{conn | path_info: ["index.html"]}
end

def redirect_index(conn, _opts) do
    conn
end

plug :redirect_index

# This is Phoenix's standard configuration of Plug.Static with
# index.html added.

plug Plug.Static,  
    at: "/", from: :phoenix_elm_starter_template, gzip: false,
    only: ~w(css fonts index.html images js favicon.ico robots.txt)

答案 2 :(得分:1)

根据Jose的回答,我会对其进行一些修改,以便直接提供index.html文件,而不是发送3xx HTTP响应。

defmodule MyApp.RootController do
  use MyApp.Web, :controller

  plug :action

  def index(conn, _params) do
    conn
    |> put_resp_header("content-type", "text/html; charset=utf-8")
    |> Plug.Conn.send_file(200, "priv/static/index.html")
  end
end