我想弄清楚如何配置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
Plug.Static
的声明是否在正确的位置?它不应该在plug :dispatch
之后吗?index.html
?index.html
上的位置我刚刚失去了。
答案 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