我正在使用 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))))
最佳答案
我认为这可以通过自定义中间件实现。 noir/server 具有公共(public)功能 add-middleware .
这是一个 page来自 webnoir 解释如何做到这一点。
根据 source code 判断这个自定义中间件首先执行,因此您可以自行处理 session 、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/moustache 网络应用程序上对其进行了测试,它运行良好。
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))))
关于http - 如何使用 Noir Web 框架进行 HTTP 302 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12469914/