2012-02-15 77 views
8

我試圖在我的網站上強制使用SSL。我想要一個環風格的中間件重定向站點到https相同的URL,如果它只是httpClojure/Noir:強制HTTPS,如果請求重定向http:// https://

我寫了下面的代碼,但除了檢查請求方案和打印它應該重定向到的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?

回答

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" 
+0

嗯,它的觸發重定向功能。但由於某種原因,它不會重定向。我應該在哪裏放置?我現在已經在server.clj之前定義了--main定義 – dMix 2012-02-15 23:48:22

+0

您需要使'ring.util.response/redirect'的返回值成爲您的處理程序的返回值,可能會被外部中間件修改(這應該讓HTTP狀態和「位置」標題,當然直接取得成功)。示例:https://refheap.com/paste/758 – 2012-02-16 00:00:31

+0

使用noir時,服務器處理程序處於比您的示例更高的抽象級別。所以我不清楚它在哪裏放置它,繼承人我的server.clj https://gist.github.com/1840261我可能會在這一個:)我的頭:) – dMix 2012-02-16 00:11:58

相關問題