路由 ============== 基本结构:: Routes = [Host] Host = {HostMatch, PathsList} | {HostMatch, Constraints, PathsList}. PathsList = [Path]. Path = {PathMatch, Handler, Opts} | {PathMatch, Constraints, Handler, Opts}. PathMatch: string() or binary() Match详解:: PathMatch1 = "/". PathMatch2 = "/path/to/resource". HostMatch1 = "cowboy.example.org". % 下面两句一样 PathMatch2 = "/path/to/resource". PathMatch3 = "/path/to/resource/". % 下面三句一样 HostMatch1 = "cowboy.example.org". HostMatch2 = "cowboy.example.org.". HostMatch3 = ".cowboy.example.org". % binding PathMatch = "/hats/:name/prices". HostMatch = ":subdomain.example.org". % http://test.example.org/hats/gordon/prices erl> cowboy_req:binding/{2,3} name => gordon subdomain => test % :_的用法 % 后面不取它的值,类似erlang的_ HostMatch = "ninenines.:_". PathMatch = "/hats/:name/:name". % []指定可选 PathMatch = "/hats/[page/:number]". HostMatch = "[www.]ninenines.eu". PathMatch = "/hats/[page/[:number]]". % [...]:多匹配 PathMatch = "/hats/[...]". HostMatch = "[...]ninenines.eu". erl> cowboy_req:host_info/1和cowboy_req:path_info/1 % '_':匹配任意host或path % "*":通配符匹配,通常与OPTION方法一起使用 PathMatch = '_'. HostMatch = '_'. HostMatch = "*". 编译:: % cowboy_route:compile/2 Dispatch = cowboy_router:compile([ %% {HostMatch, list({PathMatch, Handler, Opts})} {'_', [{'_', my_handler, []}]} ]), %% Name, NbAcceptors, TransOpts, ProtoOpts cowboy:start_http(my_http_listener, 100, [{port, 8080}], [{env, [{dispatch, Dispatch}]}] ). 在线更新:: % cowboy:set_env/3: Dispatch = cowboy_router:compile(Routes), cowboy:set_env(my_http_listener, dispatch, Dispatch). router:: % 1.在应用的priv_dir/static/目录下,所有文件的路由 % 2.文件priv/index.html Dispatch = [ {'_', [ {"/[...]", cowboy_static, [ {directory, {priv_dir, my_app, [<<"static">>]}}, {file, "index.html"}, {mimetypes, {fun mimetypes:path_to_mimes/2, default}} ]} ]} ].