如何使用Traefik 2.0和Docker Compose标签将http重定向到https?

如何使用Traefik 2.0和Docker Compose标签将http重定向到https?,docker,docker-compose,traefik,Docker,Docker Compose,Traefik,请注意,这是一个Traefik V2问题。我在V1上有一个解决方案,但V2是一个完全重新放大 上面的内容应该重定向到https://whoami.mysite.com https运行良好 http不会重定向到https并引发错误404 没有其他文件。目前所有内容都在Docker-compose.yml中,因为这是准备进一步部署的测试 version: "3.3" services: traefik: image: "traefik:v2.0" container_na

请注意,这是一个Traefik V2问题。我在V1上有一个解决方案,但V2是一个完全重新放大

上面的内容应该重定向到https://whoami.mysite.com

  • https运行良好
  • http不会重定向到https并引发错误404
没有其他文件。目前所有内容都在Docker-compose.yml中,因为这是准备进一步部署的测试

version: "3.3"

services:

  traefik:
    image: "traefik:v2.0"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web-secure.address=:443"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge=true"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"
      #- "--certificatesresolvers.myhttpchallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.myhttpchallenge.acme.email=me@mail.com"
      - "--certificatesresolvers.myhttpchallenge.acme.storage=/letsencrypt/acme.json"
    labels:
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.middlewares=redirect-to-https@docker"
      - "traefik.http.routers.whoami-secured.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami-secured.entrypoints=web-secure"
      - "traefik.http.routers.whoami-secured.tls=true"
      - "traefik.http.routers.whoami-secured.tls.certresolver=myhttpchallenge"

好的,找到了。。。我假设可以在Traefik级别声明中间件,但这些必须在服务级别声明

这一行:

- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
必须在whoami服务的标签中

另一点与所描述的问题无关,即http质询必须在端口80上完成

- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"

删除“web安全”中的“安全”

在Gérald Croës的教程中,现在有了一个可行的解决方案:


您不需要配置Traefik服务本身。在Traefik上,您只需要拥有指向:443(web安全)和:80(web)的入口点

因为Traefik只充当入口点,不会执行重定向,所以目标服务上的中间件将执行此操作

现在按以下方式配置目标服务:

version: '2'
services:
  mywebserver:
    image: 'httpd:alpine'
    container_name: mywebserver
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.mywebserver-redirect-web-secure.redirectscheme.scheme=https
      - traefik.http.routers.mywebserver-web.middlewares=mywebserver-redirect-web-secure
      - traefik.http.routers.mywebserver-web.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web.entrypoints=web
      - traefik.http.routers.mywebserver-web-secure.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web-secure.tls.certresolver=mytlschallenge
      - traefik.http.routers.mywebserver-web-secure.tls=true
      - traefik.http.routers.mywebserver-web-secure.entrypoints=web-secure
      # if you have multiple ports exposed on the service, specify port in the web-secure service
      - traefik.http.services.mywebserver-web-secure.loadbalancer.server.port=9000
所以基本上流程是这样的:


请求:-->traefik(服务)--->mywebserver web(路由器,http规则)--->mywebserver重定向web安全(中间件,重定向到https)--->mywebserver web安全(路由器,https规则)--->mywebserver(服务)

我正在寻找这个答案,当时我正在寻找如何通过Traefik v2.2将所有内容重定向到HTTPS,对我来说,最好的选择是将此ENV变量添加到Traefik,它会自动将所有流量重定向到HTTPS

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

有了这个,我不需要向中间件添加任何东西。有关该功能的更多信息可以在中找到。

我建议在这里查看文档

这对我来说很有效,如果您希望将所有流量从端口80重定向到443,这是最好的解决方案

--entrypoints.web.address=:80
--entrypoints.web.http.redirections.entryPoint.to=websecure
--entrypoints.web.http.redirections.entryPoint.scheme=https
--entrypoints.web.http.redirections.entrypoint.permanent=true
--entrypoints.websecure.address=:443
注:

这里有很多例子。请看一下WebSecurity

有时它是在web安全的情况下编写的


希望有帮助;o)

似乎全局设置不是通过标签完成的,而是通过traefik命令参数完成的。你的问题是关于标签的,但也许这个解决方案也适用于你

以下是根据以下官方文件所做的:

v1中的内容:

# static configuration
defaultEntryPoints = ["web", "websecure"]

[entryPoints]
  [entryPoints.web]
    address = ":80"
    [entryPoints.web.redirect]
      entryPoint = "websecure"

  [entryPoints.websecure]
    address = ":443"
    [entryPoints.websecure.tls]
现在看来是:

--entrypoints.web.address=:80
--entrypoints.web.http.redirections.entrypoint.to=websecure
--entrypoints.web.http.redirections.entrypoint.scheme=https
--entrypoints.websecure.address=:443
--providers.docker=true

真奇怪。我在Traefik服务上声明了重定向中间件,并从应用程序服务中引用了该中间件,它可以工作。在前面的代码中,它似乎可以工作,但http实际上没有重定向到https。如何从应用程序中引用中间件?在Traefik服务中,我有一个定义中间件的标签:
traefik.http.middleware.https only.redirectscheme.scheme=https
和应用内服务我有一个标签:
traefik.http.routers.myapp.rule=Host(
${app_Host}
traefik.http.routers.myapp.entrypoints=web
traefik.http.routers.myapp.middleware=https only
我有标签上的所有东西。据我所知,使用中间件需要两个标签:一个用于声明/配置(traefik.http.middleware.https only.redirectscheme.scheme=https),然后将其应用于服务(traefik.http.routers.myapp.middleware=https only)。声明可能位于应用程序服务或treafik服务中,例如,就像我所做的那样。请注意,即使您声明了一个middlewawe应用程序内服务,您也可以在仪表板中看到它以及在其他地方声明的其他中间件。也许我错了,但我认为你可以在任何服务中使用它们中的任何一个。我不确定这是要求。按照您描述的方式,请求似乎进入traefik端口80,并且在转发到后端服务之前,方案被更改为https。但是后端服务不执行https终止,因此将失败。其想法是进行实际的http重定向,以便请求返回到端口443上的traefik,从而保留主机。在TraefikV1中,通过静态配置很容易实现。这很有效。这应该在文档中。你只需要为http版本制作一个路由器,并在上面安装重定向中间件。谢谢,对我来说很有用。文档声明“如果您需要为HTTP和HTTPS请求定义相同的路由,那么您需要定义两个不同的路由器:一个带有tls部分,一个没有。”因此这是有意义的。如果不为端口80定义路由,重定向将不起作用。Docs here:这是文章中的docker-compose.yml注意,现有的acme.json会阻止中间件重定向到HTTPS。如果Traefik start up上已经存在,请将其删除。谢谢,这是我一直在寻找的。我没有使用ENV变量,只是在静态混淆中添加了一些行:``[entryPoints][entryPoints.web]address=“:80”[entryPoints.web.http][entryPoints.web.http.redirections][entryPoints.web.http.redirections.entryPoint]到=“websecure”scheme=“https”[entryPoints.websecure]address=“:443”``只是想在这里澄清一下-这会重定向所有服务的所有流量,并消除在服务级别声明的重定向中间件的需要?假设我这样做了,然后我有5个服务中的一个,我希望通过普通http访问,所以这里没有重定向。那么,我可以“跳过”一个服务的重定向吗?@ChristianW问得好;您应该尝试:)我想它不会工作,因为它是一个全局重定向。如果此解决方案不适用于您,导致Traefik容器本身没有开始发出错误:
命令Traefik error:failed to decode configuration from flags:field not found,node:http
尝试将Traefik版本更新为l
--entrypoints.web.address=:80
--entrypoints.web.http.redirections.entrypoint.to=websecure
--entrypoints.web.http.redirections.entrypoint.scheme=https
--entrypoints.websecure.address=:443
--providers.docker=true