metosin / reitit

A fast data-driven routing library for Clojure/Script
https://cljdoc.org/d/metosin/reitit/
Eclipse Public License 1.0
1.42k stars 254 forks source link

Resource handler: serve index file without a redirect #678

Open philipmw opened 5 months ago

philipmw commented 5 months ago

I am using ring's resource handler (ring/create-resource-handler) to serve a Vite application. Vite builds the application as index.html and other files in the same distribution directory. I rely on the resource handler's support for index files to serve this application. However, the resource handler's index files support doesn't work quite like I expect or would like.

When I request /, this handler responds with an HTTP 302 redirect to /index.html. This results in an undesired customer-visible URL. I want index.html to be an implementation detail, and for the resource handler to serve the content of index.html in response to GET / without a redirect. This would be consistent with how Apache httpd's mod_dir works; see default for DirectoryIndexRedirect directive.

Can you suggest how I can achieve the desired behavior of serving index.html transparently on GET /?

Some options I see:

  1. Create a custom route for just /index.html that serves my file directly, with the existing resource handler as a fallback for other routes. I imagine then I'd need to disable conflict resolution, which doesn't sound good.
  2. Add a configuration parameter to the ring resource handler to support the equivalent of apache httpd's DirectoryIndexRedirect options. Do you think this would be a good idea?
opqdonut commented 1 month ago

For option 1, you don't need to disable conflict resolution. You'll just have a handler set up for the path "/", and a default handler after that.

For option 2, a PR is welcome. I think it's a reasonable feature.