我正在帮助建立一个使用Clojure的Noir框架的网站,尽管我对Django/Python有更多的经验.在Django中,我习惯于使用URL等
http://site/some/url
Run Code Online (Sandbox Code Playgroud)
被302重定向到自动化
http://site/some/url/
Run Code Online (Sandbox Code Playgroud)
黑色更挑剔,不会这样做.
什么是自动执行此操作的正确方法?由于良好的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))))
Run Code Online (Sandbox Code Playgroud)
我认为这可以通过自定义中间件实现。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 "/")))))
Run Code Online (Sandbox Code Playgroud)
我在我的环/胡子网络应用程序上对其进行了测试,效果相当不错。
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))))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
492 次 |
最近记录: |