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

标签 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))))

最佳答案

我认为这可以通过自定义中间件实现。 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/

相关文章:

ruby-on-rails - HTTParty 错误 400 : Invalid header name on simple GET request

http - Flutter http.post 从不返回响应

javascript - Node.js process.nextTick 仍然阻止服务器获取请求

clojure - 为什么我不能在线程宏中使用匿名函数?

clojure - ClojureScript 中向量的索引

database - Clojure 的嵌入式(纯 Java)数据库

web - 如何在 3D 方网络托管服务器上部署 clojure noir 网站?

http - 代理 - 将 HTTP 请求转换为 SOCKS5

macros - 传递给宏的变量在错误的命名空间中被解析?

clojure - Hiccup 中的条件句,我可以让这个更惯用吗?