https – Clojure:heroku上的wrap-ssl-redirect?

我刚刚尝试添加此包装器( – > routes(wrap-ssl-redirect))以自动将http重定向到https,但是当我部署到heroku时,https://在我的浏览器中不会变绿,并且该网站无法加载.

是不是默认的heroku端口443,它也应该是wrap-ssl-redirectfunction的默认端口?

怎么了?

谢谢!

编辑:

我的代码:

(defn prod-app [routes]
  (-> routes
      (wrap-keyword-params)
      (wrap-params)
      (wrap-ssl-redirect)))

(defn -main []
  (let [port (Integer/parseInt (get (System/getenv) "PORT" "5000"))]
    (jetty/run-jetty (prod-app domain-specific-routes)
                     {:port port :join? false})))

编辑2:

我刚刚发现这个线程可以解决我的问题:Clojure / Noir: Force HTTPS, redirect if the request was http:// to https://

想出了这个require-https处理程序fn:

(defn https-url [request-url]
  (str "https://" 
       (:server-name request-url) 
       ":" 
       (:server-port request-url) 
       (:uri request-url)))

(defn require-https
  [handler]
  (fn [request]
    (if (and (= (:scheme request) :http) 
             (= (get-in request [:headers "host"]) "secure.mydomain.com"))
      (ring.util.response/redirect (https-url request))
      (handler request))))

但是,当我尝试连接到http://secure.mydomain.com时,我在浏览器地址栏https://secure.mydomain.com:80/中找到了一个端口,并收到此消息ERR_SSL_PROTOCOL_ERROR.

最佳答案 在Heroku上,你需要
bind to the port他们通过环境变量给你. Heroku还会在您的应用程序前面放置负载平衡器.他们将终止SSL连接并通过HTTP与您的应用程序通信,因此您的应用程序将看到的方案将始终是HTTP.标准的wrap-ssl-redirect在这种情况下不能很好地工作,我认为它不会成功重定向(它会认为用户通过HTTP连接,即使它们确实被重定向到HTTPS).

但是Heroku将x-forwarded-proto添加到每个请求的标头中以解决此问题,因此您可以查看客户端使用的协议.在同一个ring.middleware.ssl命名空间是一个wrap-forwarding-scheme中间件.

“Middleware that changes the :scheme of the request map to the value present
in a request header. This is useful if your application sits behind a
reverse proxy or load balancer that handles the SSL transport.
The header defaults to x-forwarded-proto.”

如果首先使用此包装路由,然后使用wrap-ssl-redirect,它应该正确地重定向到HTTPS.您还可以添加ring.middleware.ssl / wrap-hsts来强制执行HSTS

(wrap-forwarded-scheme (wrap-ssl-redirect (wrap-hsts app)))
点赞