2012-02-15 12 views
8

Sto provando a forzare SSL sul mio sito. Voglio avere un middleware stile ring per reindirizzare il sito allo stesso URL con https se è solo httpClojure/Noir: forza HTTPS, reindirizza se la richiesta era http: // a https: //

Ho scritto il seguente codice ma in realtà non fa nulla oltre a controllare lo schema di richiesta e stampare il URL a cui dovrebbe essere reindirizzato.

(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) 

Come implementarlo in un'app reale?

Sto usando Clojure 1.2 con Noir.

Nota a margine: come si combinano più stringhe in una stringa senza utilizzare più str annidati?

risposta

6

È possibile utilizzare ring.util.response/redirect:

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

Per quanto riguarda la nota a margine, str è variadic:

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

Hmm, la sua innescando quella funzione di reindirizzamento. Ma non sta reindirizzando per qualche motivo. Dove dovrei posizionarlo? Attualmente lo ho in server.clj prima di -main definizione – dMix

+0

Devi rendere il valore di ritorno di 'ring.util.response/redirect' il valore di ritorno del tuo gestore, eventualmente modificato dal middleware esterno (che dovrebbe lasciare l'HTTP stato e l'intestazione "Location" da solo per il diretto avere successo, ovviamente). Esempio: https://refheap.com/paste/758 –

+0

Con noir il gestore del server ha un livello di astrazione più alto rispetto al tuo esempio. Quindi non è chiaro a me dove metterlo, ecco il mio server.clj https://gist.github.com/1840261 Potrei essere sopra la mia testa con questo :) – dMix