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

Clojure/Noir:Force HTTPS,如果请求是http://则重定向到HTTPS://,clojure,noir,Clojure,Noir,我试图在我的站点上强制使用SSL。我想有一个环式中间件重定向到同一个网址与https的网站,如果它只是http 我编写了下面的代码,但除了检查请求方案并打印它应该重定向到的URL之外,它实际上没有做任何事情 (defn https-url [request-url] (str (str (str (str "https://" (:server-name request-url) ":") (:server-port request-url))) (:uri request-url)))

我试图在我的站点上强制使用SSL。我想有一个环式中间件重定向到同一个网址与https的网站,如果它只是http

我编写了下面的代码,但除了检查请求方案并打印它应该重定向到的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和Noir


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

您可以使用
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"

嗯,它触发了重定向功能。但由于某些原因,它并没有重定向。我应该把这个放在哪里?我目前在server.clj before-main definition中有它。您需要将
ring.util.response/redirect
的返回值设置为处理程序的返回值,可能会被外部中间件修改(当然,这应该只保留HTTP状态和“Location”头,以便direct成功)。示例:使用noir时,服务器处理程序的抽象级别高于示例中的抽象级别。因此,我不清楚该把它放在哪里,这是我的服务器。clj我可能对这一个很感兴趣:)你的处理程序总是返回
请求
;这是一个固定版本,带有一个移动的paren和包装的
处理程序
,应用于no-redirect分支中的
请求
,我认为应该可以工作: