Clojure / Noir:强制HTTPS,如果请求是http://到https://,则重定向

时间:2012-02-15 23:16:31

标签: clojure noir

我正在尝试在我的网站上强制使用SSL。我希望有一个响铃式的中间件,如果它只是http,那么用https将网站重定向到同一个URL

我编写了以下代码,但除了检查请求方案并打印应该重定向到的URL之外,它并没有真正做任何事情。

(defn https-url [request-url]
  (str (str (str (str "https://" (:server-name request-url) ":") (:server-port request-url))) (:uri request-url)))

(defn require-https
  [handler]
  (fn [request]
    (let [page-request (handler request)]
      (if (= (:scheme page-request) :http)
        (println (https-url page-request))))))

(server/add-middleware require-https)

我如何将其实现为真正的应用程序?

我正在使用黑色的clojure 1.2。

旁注:如何将多个字符串组合成一个字符串而不使用多个嵌套的str?

1 个答案:

答案 0 :(得分:6)

您可以使用ring.util.response/redirect

(fn handler [request]
  (if need-to-redirect?
    ;; NB. target-url should be a string
    (ring.util.response/redirect target-url)
    ...))

至于旁注,str是可变的:

(str "foo" 'bar "baz")
; => "foobarbaz"