6

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

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))))
4

2 回答 2

2

我认为这可以通过自定义中间件实现。noir/server 具有公共功能add-middleware

这是 webnoir 的一个页面,解释了如何做到这一点。

源代码来看,这个自定义中间件首先被执行,所以你在会话、cookie、url 参数等方面都是自己的。


我编写了一个非常愚蠢的中间件包装器版本,它检查请求 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 "/")))))

我在我的 ring/mustache 网络应用程序上对其进行了测试,它运行得相当好。


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))))
于 2012-09-18T08:02:10.087 回答
1

我发现这很有用:

(defpage "" []
  (response/redirect "/myapp/"))

/myapp -> /myapp/

于 2013-08-30T02:19:31.443 回答