Traefik v2: 全局路由HTTP流量到HTTPS时出现404

11
我有一个问题,我可以路由HTTPS流量,但无法全局将HTTP流量重定向到HTTPS。在我的情况下,我只想要HTTPS流量,因此我想重定向所有传入的流量。
目前,当我尝试通过HTTP提供我的URL时,我会收到404错误。我已经在Treafik中启用了DEBUG日志,但是我在日志中看不到任何问题或异常内容。
另外,我在Stackoverflow上看到了一个非常类似的主题,但我们发现他的错误与我的不同:如何使用Traefik 2.0和Docker Compose标签将http重定向到https? 以下设置基于这里的博客文章:https://blog.containo.us/traefik-2-0-docker-101-fc2893944b9d 我的设置如下: 我在我的群集中像这样配置了Traefik:
global:
  checkNewVersion: false
  sendAnonymousUsage: false
api:
  dashboard: true
entryPoints:
  web:
    address: :80
  websecure:
    address: :443
providers:
  providersThrottleDuration: 2s
docker:
  watch: true
  endpoint: unix:///var/run/docker.sock
  swarmMode: true
  swarmModeRefreshSeconds: 15s
  exposedByDefault: false
  network: webgateway
log:
  level: DEBUG
accessLog: {}
certificatesResolvers:
  default:
    acme:
    email: {email}
    storage: /etc/traefik/acme/acme.json
    httpChallenge:
      entryPoint: web

我使用以下docker-compose文件启动了Traefik:

version: '3'

services:
proxy:
    image: traefik:latest
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - /data/docker_data/traefik/traefik-2.yml:/etc/traefik/traefik.yml
    - /data/docker_data/traefik/acme-2.json:/etc/traefik/acme/acme.json
    labels:
    # redirect
    - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    - "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"
    - "traefik.http.routers.redirs.entrypoints=web"
    - "traefik.http.routers.redirs.middlewares=redirect-to-https"

我的服务配置了以下标签:

traefik.http.routers.myapp.rule=Host(`myapp.ch`)
traefik.http.routers.myapp.service=myapp
traefik.http.routers.myapp.entrypoints=websecure
# I don't think that the following one is required here...
# traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
traefik.http.routers.myapp.tls.certresolver=default
traefik.http.services.myapp.loadbalancer.server.port=3000
traefik.http.routers.myapp.tls=true
traefik.enable=true

有什么想法,为什么这个不起作用?

根据Lars的回答,是的。 但是使用他的配置,我无法全局解决它,但我能够解决它。 - mbaldi
2个回答

14

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

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

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

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

所以基本上流程如下:

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


谢谢你的回答,Lars。 我尝试了一下,太棒了,我成功了。非常感谢你。 但是,当我再次阅读你的答案时,Traefik v2中是否不可能创建全局重定向? 无论如何,我对你的答案很感兴趣,但我会将这个问题标记为已解决。 - mbaldi
我还没有想出如何在全局范围内实现它。我认为目前不可能... :) - Lars
目前还不可能。他们已经意识到这一点/希望改进这一点。https://community.containo.us/t/a-global-http-https-redirection/864/7 - Andrew Savinykh
1
此外,解决方法:https://community.containo.us/t/global-redirect-www-to-non-www-with-https-redirection/2313/6?u=zespri - Andrew Savinykh

6
针对那些正在尝试在Traefik 2上进行全局HTTP到HTTPS重定向的人,以下内容可能会帮到你。有些人可能会在http端点上遇到404错误。在花费了几个小时查阅不同论坛之后,这个方法适用于我,并且适用于想要使用预签名SSL证书的人。
大多数人使用的是traefik博客中提供的配置,但其中许多都没有包含traefik容器的命令部分。出于安全考虑,我们需要声明: "--providers.docker.exposedbydefault=false" 如果没有给出 "traefik.enable=true" 则会防止全局https重定向器正常工作。以下是完整的文件:
version: "3.8"
services:
  traefik:
    image: "traefik:v2.2.1"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.watch=true"
      - "--providers.file.directory=/conf/"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
    ports:
      - "80:80"
      - "443:443"
    networks:
      - somenetwork
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - ./certs:/certs
      - ./conf:/conf
    labels:
      # this is needed as we did the --providers.docker.exposedbydefault=false
      - "traefik.enable=true"
      # middleware redirect
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      # global redirect to https
      - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
      - "traefik.http.routers.http-catchall.entrypoints=web"
      - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
  whoami:
    image: "containous/whoami"
    container_name: "simple-service"
    networks:
      - somenetwork
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami-secure.entrypoints=websecure"
      - "traefik.http.routers.whoami-secure.tls=true"
      - "traefik.http.routers.whoami-secure.rule=Host(`test.traefik.localhost`)"

我还将certificates.toml添加到conf目录中。如果您正在本地主机上工作,则可以使用mkcert openssl等工具将其添加。对于生产环境,您需要从证书提供商那里获取此文件。并且,您需要将证书添加到certs文件夹中。

[[tls.certificates]] #first certificate
   certFile = "/certs/_wildcard.traefik.localhost.pem"
   keyFile = "/certs/_wildcard.traefik.localhost-key.pem"

当然,您可以使用Let's Encrypt。关于这个话题有很多博客。希望这可以节省您的时间。 :)

谢谢!起初我差点忽略了你的评论,因为我已经在 webapp 上设置了 traefik.enable=true,但后来意识到你是指在实际的 traefik 容器上也要设置! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接