如何使用Noir Web框架进行HTTP 302重定向

时间:2012-09-18 03:16:38

标签: http clojure noir

我正在帮助建立一个使用Clojure的Noir框架的网站,尽管我对Django / Python有更多的经验。在Django中,我习惯使用诸如

之类的URL
http://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))))

2 个答案:

答案 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的/