Serving root level static assets when a match all route

I have a LiveView with a router that matches on any /:token given as the first part of the path. This is causing static assets in the root dir like /favicon.ico and /robots.txt to match this route. Is there any way around this?


Plug.Static should come before your router in endpoint.ex. If there’s no actual file though it’ll move on to the router.

Sorry, I mean to say that I did check that the ordering is correct in endpoint.ex. I’m just realizing that files inside assets/static don’t actually get loaded (at last not in development) whereas assets in priv/static do. Is this correct or did I mess something up?

That’s how it’s supposed to work. assets is only for source files of the assets pipeline (webpack by default).

Thank you for your help. I’m realizing that yes, that is how it works, I just got myself in an odd state and started questioning everything.

I believe this happened when following advice on how to deal with a recent change in CopyWebpackPlugin. In any event, somehow my /priv ended up with a directory called * in it and inside there was static.

Bah, it’s been a day of blunders like this for me!

Thanks again.

It also depends on the version of CopyWebpackPlugin… Phoenix use 5.x syntax, but if You are using 6.x branch of the webpack plugin, You need to update webpack.config.js to…

# old syntax
new CopyWebpackPlugin([{ from: "static/", to: "./" }]),

# new 6.x syntax
new CopyWebpackPlugin({
 patterns: [{ from: "static/", to: "./" }]

This plugin is in charge of copying what is in assets/static to priv/static. You should not touch priv/static, and just put into assets/static


Yes! I juuuust realized this (see my answer above). But thank you! I wasn’t 100% sure that’s what happened and now you’ve confirmed for me :slight_smile:

1 Like