请注意,这是Traefik V2问题。我在V1上有一个解决方案,但V2完全是重新封装。
以上内容应该将http://whoami.mysite.com重定向到http s ://whoami.mysite.com。
没有其他文件。目前,这一切都在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"
答案 0 :(得分:26)
我建议在这里查看文档Entrypoint redirect 80 > 443
这对我很有用,如果您希望将所有流量从端口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
注意:
周围有很多例子。只需看一下websecure。
有时它是写为网络安全的。
希望有帮助; o)
答案 1 :(得分:3)
当我正在寻找如何通过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
有了这个,我不需要向中间件添加任何东西。可以在official documentation中找到有关该功能的更多信息。
答案 2 :(得分:2)
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"
答案 3 :(得分:1)
好吧,发现...我假设中间件可以在Traefik级别声明,但是必须在服务级别声明。
此行:
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
必须在whoami服务的标签中。
与上述问题无关的另一点是,必须在端口80上进行http质询。
- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"
删除“网络安全”中的“安全”。
答案 4 :(得分:1)
您不需要配置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(服务)
答案 5 :(得分:1)
似乎全局设置不是使用标签完成的,而是使用traefik命令参数完成的。您的问题是关于标签的,但是也许该解决方案也对您有用?
根据https://docs.traefik.io/migration/v1-to-v2/#http-to-https-redirection-is-now-configured-on-routers
下的官方文档,这是要做的事情第1版中的内容:
# 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