【问题标题】:Redirect HTTP requests to HTTPS on Google App Engine and Play Framework在 Google App Engine 和 Play Framework 上将 HTTP 请求重定向到 HTTPS
【发布时间】:2017-10-31 09:12:41
【问题描述】:

我在 Google App Engine 上使用灵活的环境来运行用 Scala 和 Play Framework 编写的网络应用程序。我已将自定义域添加到我的应用程序中,现在我的应用程序可通过 http 和 https 使用。但我需要从 http 重定向到 https。我尝试通过执行以下操作来管理它,但它不起作用:

application.conf:

play.http.filters = "controllers.Filters"

控制器.过滤器:

import javax.inject.Inject

import play.api.http.DefaultHttpFilters
import play.filters.cors.CORSFilter
import play.filters.https.RedirectHttpsFilter

class Filters @Inject() (corsFilter: CORSFilter, redirectHttpsFilter: RedirectHttpsFilter) extends DefaultHttpFilters(corsFilter, redirectHttpsFilter)

UPD 也许问题是我需要在我的 Dockerfile 中指定 https 端口? 这是一个 Dockerfile:

FROM gcr.io/google_appengine/openjdk
RUN wget http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.deb
RUN dpkg -i scala-2.11.8.deb
RUN wget https://dl.bintray.com/sbt/debian/sbt-0.13.13.deb
RUN dpkg -i sbt-0.13.13.deb
RUN apt-get update
RUN apt-get install scala sbt
RUN rm -f scala-2.11.8.deb
RUN rm -f sbt-0.13.13.deb
ADD . /appname
WORKDIR /appname
RUN chmod 755 ./docker-entrypoint.bash
ENTRYPOINT ["./docker-entrypoint.bash"]
CMD ["./target/universal/stage/bin/appname", "-Dhttp.port=8080"]

【问题讨论】:

  • 如果您使用 app.yaml 进行配置,则应参考 google 指南:cloud.google.com/appengine/docs/standard/python/config/…
  • @DanielPrzybylowski 本指南适用于标准环境。
  • 您的应用程序是否在 Prod 模式下运行?
  • @FredericA。是的
  • 这对我来说很好。尽管我注意到您的Filters.scala 文件中没有package controllers 定义,但我确定您的sn-p 中缺少此定义-如果找不到controllers.Filters 类,您会在启动时看到一个很大的警告.你能用 curl 发出请求并显示输出吗?另外,如果您编写自己的过滤器在RedirectHttpsFilter 之前运行并打印出请求的secure 字段的值,会发生什么?

标签: scala google-app-engine https playframework app-engine-flexible


【解决方案1】:

您可能需要编写另一个小型应用程序,侦听 http 端口并向任何传入请求发出 Location 标头?

【讨论】:

    【解决方案2】:

    我是这样实现我想要的:

    class Filters @Inject() (corsFilter: CORSFilter, redirectHttpsFilter: HttpsFilter)
                         extends DefaultHttpFilters(corsFilter, redirectHttpsFilter)
    
    @Singleton
    class HttpsFilter extends EssentialFilter {
    
      override def apply(next: EssentialAction): EssentialAction =  EssentialAction { req =>
        req.headers.get("X-Forwarded-Proto") match {
          case Some("http") =>
            //Got request over HTTP
            val httpsUrl = s"https://${req.host}"
            Accumulator.done(Results.Redirect(httpsUrl))
          case _ =>
            next(req)
        }
      }
    }
    

    application.conf:

    play.http.filters = "controllers.Filters"
    

    【讨论】:

      【解决方案3】:

      我不知道为什么@alex 解决方案对我不起作用。即使XForwardedProto 允许在application.conf 中使用

      但是,您可以检查req 是否在简单模式下是安全的(布尔值),而不是检查这个值:

      @Singleton
      class HttpsFilter extends EssentialFilter {
        override def apply(next: EssentialAction): EssentialAction = EssentialAction { req =>
          req.secure match {
            case false => {
              val httpsUrl= s"https://${req.host}"
              Accumulator.done(Results.Redirect(httpsUrl))
            }
            case true => next(req)
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-04
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        相关资源
        最近更新 更多