Best practices for routes with multi-domain routers?

My Phoenix app has a variety of scopes distinguished by host as follows:

  scope "/", LockerWeb, host: "host.example.com" do
    pipe_through :inertia

    get "/", HostController, :index
    get "/connect", HostController, :connect
  end

  scope "/", LockerWeb, host: "play.example.com" do
    pipe_through :browser

    get "/", PageController, :landing
    post "/access", PageController, :access

    get "/join", PageController, :show_join
    post "/join", PageController, :do_join
  end

Is there a better option for routes than my own homegrown replacement of VerifiedRoutes? AFAICT it doesn’t take the hostnames of scopes into consideration.

I suspect the robust solution here would be multiple endpoints, perhaps in an umbrella app, but this is already a teensy application that will perhaps max out at two dozen routes.

Thanks!

Thanks! The inbound routing part works fine with scopes in a router - it’s just that I’m not sure about the best way to build links in my app via routes. Would your approach impact how links are constructed via routes ala VerifiedRoutes ?

You can still use verified routes and changing the host in the conn.

Setting the host in the router, if you are only dealing with subdomains is great, but if the host can be more dynamic, then it might be easier to set them in the conn in your endpoint per request . If your app is running on multiple servers with their own domain then you can let your load balancer deal with it and keep your app dumb.

Phoenix.VerifiedRoutes — Phoenix v1.7.20 Phoenix.Controller — Phoenix v1.7.20

Appreciate the response. I’m probably either misunderstanding and/or I haven’t explained my issue very well.

In the example above, the verified route ~p"/" could refer to two different controllers and two different actions. In a single response, I need to build links that could refer to either - some links in a page point to host.example.com routes from play.example.com and some won’t.

I’m not sure I could set the host on a per-conn basis because of this intermixing of links within a single response. Perhaps you mean setting the host on the conn when passing it into the url methods?

Right now, my solution is a new function, cross_domain_url that accepts a host parameter that is derived from the same keys in config.exs that drive the hostnames on the scopes. It works, but I’m just curious if there’s something I’m missing in how routes are supposed to work when combined with scopes with hosts.

For example, mix phx.routes generates a number of duplicated routes because it isn’t taking the scope’s hosts into account

  GET   /                                      LockerWeb.HostController :index
  GET   /                                      LockerWeb.PageController :show_join

url/3 takes more then a conn, you can use conn, socket, endpoint or uri. I’ll admit I purposely did not give you an exact answer, but a more general one. The main point is, nothing stopping you from using verified routes with highly dynamic host and url generations.