2012-02-15 21 views
8

私は自分のサイトにSSLを強制しようとしています。私はHTTPだけであればhttpsで同じURLにサイトをリダイレクトするためのリングスタイルのミドルウェアを持っていますClojure/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) 

これを実際のアプリケーションに実装するにはどうすればよいですか?

私はNoirとclojure 1.2を使用しています。

サイドノート:複数のネストされた文字列を使用せずに複数の文字列を1つの文字列に結合するにはどうすればよいですか?

答えて

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

+0

'ring.util.response/redirect'の戻り値をハンドラの戻り値にする必要があります。おそらく外部のミドルウェアによって変更されますステータスと "Location"ヘッダーだけで、成功のダイレクトが成功するのはもちろんです)。例:https://refheap.com/paste/758 –

+0

noirを指定すると、サーバーハンドラのレベルは、例より高いレベルになります。だから、どこに置くのか分からないので、私のserver.cljを参考にしてください。https://gist.github.com/1840261私はこれで私の頭の中にいるかもしれません:) – dMix

関連する問題