http - moved - redireccion 302
Cómo hacer redireccionamientos HTTP 302 con el framework Noir Web (2)
Creo que esto puede ser posible con un middleware personalizado. noir / server tiene función pública add-middleware .
Aquí hay una página de webnoir que explica cómo hacerlo.
A juzgar por el código fuente, este middleware personalizado se ejecuta primero, por lo que estaría solo en términos de sesiones, cookies, parámetros de URL, etc.
Escribí una versión muy tonta de la envoltura de middleware que comprueba si el URI de solicitud finaliza con una barra inclinada y, si no, redirige al URI con una barra al final:
(use [ring.util.response :only [redirect]])
(defn wrap-slash [handler]
(fn [{:keys [uri] :as req}]
(if (.endsWith uri "/")
(handler req)
(redirect
(str uri "/")))))
Lo probé en mi aplicación web de anillo / bigote y funcionó razonablemente bien.
EDIT1 (Ampliando mi respuesta después de su respuesta a mi comentario).
Puede usar middleware personalizado para agregar o quitar URL de barra inclinada. Simplemente haz algo así para eliminar la barra final:
(use [ring.util.response :only [redirect]])
(defn add-slash [handler]
(fn [{:keys [uri] :as req}]
(if (.endsWith uri "/")
(handler (assoc req
:uri (.substring uri
0 (dec (count uri)))))
(handler req))))
Estoy ayudando a configurar un sitio web con el marco Noir de Clojure, aunque tengo mucha más experiencia con Django / Python. En Django, estoy acostumbrado a las URL como
http://site/some/url
siendo 302-redirigido automágicamente a
http://site/some/url/
Noir es más exigente y no hace esto.
¿Cuál sería la forma correcta de hacer esto automáticamente? Dado que las buenas URL son una forma importante de abordar en un sitio, y muchos usuarios se olvidarán de la barra final, esta es una funcionalidad básica que me gustaría agregar a mi sitio.
EDITAR: Esto es lo que finalmente funcionó para mí, basado en las sugerencias de @ IvanKoblik:
(defn wrap-slash [handler]
(fn [{:keys [uri] :as req}]
(if (and (.endsWith uri "/") (not= uri "/"))
(handler (assoc req :uri (.substring uri
0 (dec (count uri)))))
(handler req))))
Encontré esto útil:
(defpage "" []
(response/redirect "/myapp/"))
/ myapp -> / myapp /