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


14

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

以上内容应该将http://whoami.mysite.com重定向到http s://whoami.mysite.com。

  • http 运行良好。
  • 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"

Answers:


10

现在,来自GéraldCroës的教程中提供了一个可行的解决方案,网址为:

https://blog.containo.us/traefik-2-0-docker-101-fc2893944b9d

services:  
  traefik:  
    image: "traefik:v2.0.0"  
    # ...  
    labels:  
      # ...        
      # middleware redirect  
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"  
      # global redirect to https  
      - "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"  
      - "traefik.http.routers.redirs.entrypoints=web"  
      - "traefik.http.routers.redirs.middlewares=redirect-to-https"  


1
请注意,拥有现有的acme.json可能会阻止中间件重定向到HTTPS。如果Traefik启动时已经存在,请将其删除。
AymDev

7

您不需要配置Traefik服务本身。在Traefik上,您仅需要具有:443(网络安全)和:80(网络)的入口点

因为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

所以基本上流程是这样的:

请求:http ://sub.domain.com : 80-> traefik(服务)-> mywebserver-web(路由器,http规则)-> mywebserver-redirect-web-secure(中间件,重定向至https)- -> mywebserver-web-secure(路由器,https规则)-> mywebserver(服务)


不确定这是要求。按照您的描述方式,请求似乎进入traefik端口80,并且在转发给后端服务之前,该方案已更改为https。但是后端服务不会执行https终止,因此将失败。想法是进行实际的http重定向,以便请求返回到保留主机的端口443上的traefik。在Traefik v1中,可以通过静态配置轻松完成。
Andrei Dascalu

这可行。这应该在文档中。您只需要为http版本制作一个路由器,然后在上面放置重定向中间件即可。
milosa

2

好的,发现...我假设可以在Traefik级别声明中间件,但是必须在服务级别声明中间件。

这行:

- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

必须在whoami服务的标签中。

与所描述的问题无关的另一点是,必须在端口80上执行http质询。

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

删除“网络安全”中的“安全”。


真奇怪。我在Traefik服务上声明了重定向中间件,并从应用程序服务中引用了该中间件,并且该中间件有效。
Izydorr

使用前面的代码,它似乎可以工作,但是http实际上不会重定向到https。
锡伯

您如何从应用程序中引用中间件?
锡伯

在traefik服务,我有一个标签定义的中间件: traefik.http.middlewares.https-only.redirectscheme.scheme=https 和应用程序服务,我有一个标签:traefik.http.routers.myapp.rule=Host($ {} APP_HOST )traefik.http.routers.myapp.entrypoints=webtraefik.http.routers.myapp.middlewares=https-only
Izydorr

1
我把所有东西都贴在标签上了。据我了解,使用中间件需要两个标签:一个用于声明/配置(traefik.http.middlewares.https-only.redirectscheme.scheme = https),然后将其应用于服务(traefik.http.routers.myapp.middlewares =仅https)。声明可以位于应用程序服务或treafik服务中,就像我一样。请注意,即使您在应用程序服务中声明了Middlewawe,您也会在仪表板中看到它,并在其他地方声明了其他中间件。也许我错了,但我认为您可以在任何服务中使用它们中的任何一个。
Izydorr

1

当我正在寻找如何通过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

这样,我无需向中间件添加任何内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.