我正在帮助建立一个使用Clojure的Noir框架的网站,尽管我对Django / Python有更多的经验。在Django中,我习惯使用诸如
之类的URLhttp://site/some/url
自动302重定向到
http://site/some/url/
Noir更挑剔,不会这样做。
自动执行此操作的正确方法是什么?由于良好的URL是寻址网站的重要方式,许多用户将忘记尾随斜杠,这是我想要添加到我的网站的基本功能。
编辑:基于@ 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))))
答案 0 :(得分:2)
我认为这可能适用于自定义中间件。 noir / server具有公共功能add-middleware。
这是来自webnoir的page,解释了如何做到这一点。
根据source code判断这个自定义中间件是先执行的,所以你在会话,cookie,url params等方面都是独立的。
我编写了一个非常愚蠢的中间件包装器版本,用于检查请求URI是否以斜杠结尾,如果没有重定向到带有斜杠的URI:
(use [ring.util.response :only [redirect]])
(defn wrap-slash [handler]
(fn [{:keys [uri] :as req}]
(if (.endsWith uri "/")
(handler req)
(redirect
(str uri "/")))))
我在我的戒指/胡子网络应用程序上进行了测试,结果相当不错。
EDIT1(在回复我的评论后扩大我的答案。)
您可以使用自定义中间件来添加或删除尾部斜杠的URL。只需做这样的事情就可以去除尾随斜杠:
(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))))
答案 1 :(得分:1)
我觉得这很有用:
(defpage "" []
(response/redirect "/myapp/"))
/ myapp - > / MyApp的/