2012-02-15 11 views
8

Próbuję zmusić SSL do mojej witryny. Chcę mieć medium w stylu pierścienia do przekierowania witryny do tego samego adresu URL za pomocą protokołu https, jeśli jest to tylko httpClojure/Noir: Wymuś HTTPS, przekieruj, jeśli żądanie było http: // na https: //

Napisałem poniższy kod, ale tak naprawdę nic nie robi, oprócz sprawdzenia schematu żądania i wydrukowania Adres URL, do którego powinien przekierowywać.

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

Jak zastosować to w prawdziwej aplikacji?

Używam clojure 1.2 z Noir.

Nota boczna: Jak połączyć wiele ciągów w jeden ciąg bez użycia wielu zagnieżdżonych str?

Odpowiedz

6

Można użyć ring.util.response/redirect:

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

chodzi o marginesie, str jest o zmiennej liczbie argumentów:

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

Hmm, jego wyzwalanie tę funkcję przekierowania. Ale z jakiegoś powodu nie przekierowuje. Gdzie mam to umieścić? Obecnie mam go w server.clj przed -main definicji – dMix

+0

Musisz zrobić wartość zwracaną 'ring.util.response/redirect' zwracaną wartość swojego handlera, ewentualnie być modyfikowane przez zewnętrzne middleware (które powinny opuścić HTTP status i nagłówek "Lokalizacja" dla bezpośredniego powodzenia, oczywiście). Przykład: https://refheap.com/paste/758 –

+0

Dzięki funkcji noir obsługa serwera jest na wyższym poziomie abstrakcji niż w twoim przykładzie. Więc nie jest dla mnie jasne, gdzie to ująć, heres mój server.clj https://gist.github.com/1840261 Może być w mojej głowie z tym :) – dMix

Powiązane problemy