clojure - Servir index.html en/por defecto en Compojure
(8)
Después de ver muchas de las respuestas aquí, estoy usando el siguiente código:
(ns app.routes
(:require [compojure.core :refer [defroutes GET]]
[ring.util.response :as resp]))
(defroutes appRoutes
;; ...
;; your routes
;; ...
(GET "/" []
(resp/content-type (resp/resource-response "index.html" {:root "public"}) "text/html"))))
- No redirecciones;
- No hay necesidad de otro middleware;
- index.html permanece en la carpeta correcta (resources / public / index.html);
- Funciona con otro middleware (muchas de las respuestas se rompen cuando se usa con un middleware predeterminado de anillo);
- Proporciona contenido de tipo, por lo que funciona con middleware de tipo de contenido de envoltura.
Compruebe ring-defaults . Tiene las mejores prácticas de middleware que debe utilizar en sus proyectos.
Tengo un archivo estático llamado index.html
que me gustaría servir cuando alguien solicita /
. Por lo general, los servidores web hacen esto de manera predeterminada , pero Compojure no lo hace. ¿Cómo puedo hacer que Compojure sirva index.html
cuando alguien solicita /
?
Aquí está el código que estoy usando para el directorio estático:
; match anything in the static dir at resources/public
(route/resources "/")
Este sería un middleware bastante simple de Ring:
(defn wrap-dir-index [handler]
(fn [req]
(handler
(update-in req [:uri]
#(if (= "/" %) "/index.html" %)))))
Simplemente envuelva sus rutas con esta función, y las solicitudes /
transformadas en solicitudes de /index.html
antes de que el resto de su código las vea.
(def app (-> (routes (your-dynamic-routes)
(resources "/"))
(...other wrappers...)
(wrap-dir-index)))
Esto funciona bien. No hay necesidad de escribir un medio de anillo.
(:require [clojure.java.io :as io])
(defroutes app-routes
(GET "/" [] (io/resource "public/index.html")))
Recientemente, descubrí que la respuesta de @ amalloy no funciona cuando la aplicación Clojure / Compojure se ejecuta bajo Jetty o Tomcat como .war. En este caso :path-info
necesita ser actualizada. Además, creo que esta versión manejará cualquier ruta, no solo la ruta "raíz".
(defn- wrap-dir-index [handler]
(fn [request]
(handler
(let [k (if (contains? request :path-info) :path-info :uri) v (get request k)]
(if (re-find #"/$" v)
(assoc request k (format "%sindex.html" v))
request)))))
Consulte también: https://groups.google.com/forum/#!msg/compojure/yzvpQVeQS3w/RNFkFJaAaYIJ
ACTUALIZADO: Ejemplo reemplazado con una versión que funciona.
Solo una consideración Binita, un gotcha que he estado experimentando. A pesar de que no pude encontrar ninguna documentación sobre la importancia del orden que define las rutas de Compojure, descubro que esto no funciona
(GET "/*" [] r/static)
(GET "/" [] (clojure.java.io/resource "public/index.html"))
mientras esto funciona
(GET "/" [] (clojure.java.io/resource "public/index.html"))
(GET "/*" [] r/static)
Obviamente, el *
coincide también con la cadena vacía, pero pensé que el orden no debería importar en absoluto.
Una alternativa podría ser crear una redirección o una respuesta directa en una ruta adicional. Al igual que:
(ns compj-test.core
(:use [compojure.core])
(:require [compojure.route :as route]
[ring.util.response :as resp]))
(defroutes main-routes
(GET "/" [] (resp/file-response "index.html" {:root "public"}))
(GET "/a" [] (resp/resource-response "index.html" {:root "public"}))
(route/resources "/")
(route/not-found "Page not found"))
La ruta "/" devuelve una respuesta de archivo de "index.html" que está presente en la carpeta pública. La ruta "/ a" responde directamente "en línea" con el archivo index.html.
Más información sobre las respuestas en anillo: https://github.com/mmcgrana/ring/wiki/Creating-responses
EDIT: eliminó la importación innecesaria [ring.adapter.jetty]
.
cuando otro código no funciona, intente este código.
(GET "/about/" [] (ring.util.response/content-type
(ring.util.response/resource-response "about/index.html" {:root "public"}) "text/html"))
(ns compj-test.core
(:use [compojure.core])
(:require
[ring.util.response :as resp]))
(defroutes main-routes
(GET "/" [] (resp/redirect "/index.html")))
Lo que estás pidiendo es una redirección de / a /index.html. Es tan simple como (resp / redirect target) . No hay necesidad de complicar más las cosas.