问题
I'm trying to force SSL on my site. I want to have a ring style middle-ware to redirect the site to the same URL with https if it is only http
I wrote the following code but it doesn't really do anything besides check the request scheme and print the URL it should be redirecting to.
(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)
How would I implement this into a real app?
I'm using clojure 1.2 with Noir.
Side note: How do I combine multiple strings into one string with out using multiple nested str's?
回答1:
You can use ring.util.response/redirect
:
(fn handler [request]
(if need-to-redirect?
;; NB. target-url should be a string
(ring.util.response/redirect target-url)
...))
As for the side note, str
is variadic:
(str "foo" 'bar "baz")
; => "foobarbaz"
来源:https://stackoverflow.com/questions/9303054/clojure-noir-force-https-redirect-if-the-request-was-http-to-https