如何在没有Phoenix的情况下配置Plug.Static

时间:2015-09-12 20:13:05

标签: elixir phoenix-framework cowboy

我想弄清楚如何配置Plug.Static 而不用任何其他框架(Phoenix,Sugar等);只是牛仔,插头和Elixir。我只是不知道如何把东西放在路由器里。

  plug :match
  plug Plug.Static, at: "/pub", from: :cerber
  plug :dispatch

  get "/" do
    Logger.info "GET /"
    send_resp(conn, 200, "Hello world\n")
  end
  1. Plug.Static的声明是否在正确的位置?它不应该在plug :dispatch之后吗?
  2. 我是否需要定义其他路线
  3. 有了这个声明:
    1. 要覆盖的网址是什么,请说index.html
    2. 应该找到文件系统index.html上的位置
  4. 我刚刚失去了。

3 个答案:

答案 0 :(得分:9)

请查看link了解:match:dispatch的工作原理。 :match将尝试查找匹配的路由,:dispatch将调用它。这意味着如果您的路由器中有匹配的路由,则只会调用您的设置中的Plug.Static,这是没有意义的。在所有事情之前你想要plug Plug.Static。请记住,插件只是按声明顺序调用的函数。

除此之外,您的Plug.Static设置似乎没问题。您当前的配置将在“/ pub”中提供资源,这意味着“/pub/index.html”将在您的应用中查找“priv / static / index.html”。更多信息:Plug.Router docs

答案 1 :(得分:3)

JoséValim所说的一切。这里有一个最简单的例子:

defmodule Server do
  use Plug.Builder
  plug Plug.Logger
  plug Plug.Static, at: "/", from: "/path/to/static"
end

这将在“/”端点的“/ path / to / static”中提供所有静态文件。

查看文档以获取更多选项和更深入的解释。

答案 2 :(得分:3)

这是我一直在寻找的答案。

在应用程序启动方法中,将Plug.Router与Cowboy一起使用:

defmodule HttpServer.Application do
  require Logger
  use Application

  def start(_type, _args) do
    children = [
      {Plug.Adapters.Cowboy2, scheme: :http, plug: HttpServer.Router, options: [port: 4002]}
    ]

    opts = [strategy: :one_for_one, name: HttpServer.Supervisor]

    Supervisor.start_link(children, opts)
  end
end

路由器模块如下所示:

defmodule HttpServer.Router do
  use Plug.Router

  plug(Plug.Logger)
  plug(:redirect_index)
  plug(:match)
  plug(:dispatch)

  forward("/static", to: HttpServer.StaticResources)

  get "/sse" do
    # some other stuff...
    conn
  end

  match _ do
    send_resp(conn, 404, "not found")
  end

  def redirect_index(%Plug.Conn{path_info: path} = conn, _opts) do
    case path do
      [] ->
        %{conn | path_info: ["static", "index.html"]}

      ["favicon.ico"] ->
        %{conn | path_info: ["static", "favicon.ico"]}

      _ ->
        conn
    end
  end
end

此处将对“ / static”的请求转发到HttpServer.StaticResources模块,但首先,使用plug(:redirect_index)修改“ /”和“ /favicon.ico”的请求路径。所有静态文件(* .html,*。ico,*。css,*。js等)都放置在默认位置(project_dir / priv / static)。

最后,StaticResource模块:

defmodule HttpServer.StaticResources do
  use Plug.Builder

  plug(
    Plug.Static,
    at: "/",
    from: :http_server
  )

  plug(:not_found)

  def not_found(conn, _) do
    send_resp(conn, 404, "static resource not found")
  end
end