我正在尝试将所有传入的 Traefik 从 http 重定向到 https,用于从具有自定义端口的 docker 容器提供服务的 Web 应用程序。

如果我构建这个 docker compose 文件,并扩展应用程序,一切都会按预期工作。我能够请求应用程序的 http 和 https,但我尝试实现只提供 https 并且 http 被重定向到 https。

由于我使用 Docker-Compose 文件,因此我没有 Traefik.toml,因此尝试在没有 Traefik.toml 的情况下完成此操作。

Docker Compose:

traefik:
  image: traefik:latest
  command:
   - "--api"
   - "--docker"
   - "--docker.domain=example.com"
   - "--logLevel=DEBUG"
   - "--docker.watch"
  labels:
    - "traefik.enable=true"
  ports:
    - "80:80"
    - "8080:8080"
    - "443:443"
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - /dev/null:/traefik.toml

application:
  image: application
  command: web
  tty: false
  stdin_open: true
  restart: always
  expose:
    - "8081"
  labels:
    - "traefik.backend=application"
    - "traefik.frontend.rule=HostRegexp:{subdomain:[a-z]+}.example.com"
    - "traefik.frontend.priority=1"
    - "traefik.enable=true"
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock

我尝试了应用程序容器的不同变体,例如:
- "traefik.frontend.entryPoints=http,https"
- "traefik.frontend.redirect.entryPoint=https"
- "traefik.frontend.headers.SSLRedirect=true"

但是我可以完成的最大任务是使用 SSLRedirect 标签进行多次重定向响应,如果没有我从 traefik 获得以下内容,并且 http 或 https 请求都无法正确转发。
 level=error msg="Recovered from panic in http handler: runtime error: invalid memory address or nil pointer dereference"

谁能把我推向正确的方向?

提前致谢 ;)

我在以下设置下运行
 user:~$ docker --version
 Docker version 1.13.1, build 092cba3

 user:~$ docker-compose --version
 docker-compose version 1.8.0

Docker PS 响应
IMAGE           COMMAND                 ... PORTS                                                              NAMES
application     "dotnet Web..."         ... 8081/tcp                                                           components_application_1
traefik:latest  "/traefik --api --..."  ... 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->8080/tcp   components_traefik_1

基础设施设置
 aws-elb => vpc => ec2...ecn
                   traefik per instance,
                   n applications per instance

最佳答案

这仅在 traefik v1.7 之前有效,在 v2.* 之后您需要另一个配置设置,我还没有弄清楚

经过深入研究,我自己找到了解决方案。

问题是应用程序容器上缺少标签,
在我添加之后

- "traefik.frontend.headers.SSLProxyHeaders=X-Forwarded-Proto: https"
- "traefik.frontend.headers.SSLRedirect=true"

在我的应用程序容器上,它就像一个带有明确 301 重定向的魅力。

为什么需要 header ,默认情况下 aws-elb 接受 https 请求并将其与 HTTP(80) 转发到连接的实例,在此过程中,elb 将 X-Forwarded-Proto: https header 添加到请求中。

由于 traefik 不知道它在 elb 后面运行,因此它一遍又一遍地进行重定向。但是 Header 阻止了这种行为。

关于docker - HTTPS 重定向与 Traefik 背后的 Aws Loadbalancer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49148624/

10-16 12:38
查看更多