traefik - HTTP到HTTPS WWW重定向

时间:2017-09-06 23:02:00

标签: https traefik

我找不到类似的问题,还有其他人提到https重定向,但没有提到最小化重定向。

一直在寻找解决方案,但还是无法解决。

我们使用Docker> Traefik for WordPress并将www作为WordPress的首选版本。有多个WP实例。域是动态添加的。

但是,使用此配置,我收到两个重定向,从http到https到https www

$this->db->or_where()

有没有办法最小化重定向?

理想情况下来自

的301重定向
http://example.com/
https://example.com/
https://www.example.com/

Traefik配置文件如下

http://example.com directly to https://www.example.com 

4 个答案:

答案 0 :(得分:5)

尝试用以下内容替换您的[entryPoints.http.redirect]条目:

[entryPoints.http.redirect]
#entryPoint = "https"
regex = "^http:\/\/(www\.)*(example\.com)(.*)"
replacement = "https://www.$2/$3"
permanent = true

Regex101

它不会处理https://example.com/条目,因此您需要添加:

[entryPoints.https.redirect]
regex = "^https:\/\/(example\.com)(.*)"
replacement = "https://www.$1/$2"
permanent = true

如果您有多个frontedns,则正则表达式可能会很难处理,因此您可以考虑使用a label on the container,如下所示:

traefik.frontend.headers.SSLRedirect=true
traefik.frontend.headers.SSLHost=www.example.com

从1.7开始,有一个新选项SSLForceHost甚至可以强制重定向现有的SSL连接。

traefik.frontend.headers.SSLForceHost=true

答案 1 :(得分:0)

这就是我与AWS ELB背后的docker provider一起工作的方式。

traefik容器

/usr/bin/docker run --rm \
  --name traefik \
  -p 5080:80 \
  -p 5443:443 \
  -v /etc/traefik/traefik.toml:/etc/traefik/traefik.toml \
  -v /var/run/docker.sock:/var/run/docker.sock \
  traefik

traefik.toml

defaultEntryPoints = ["http", "https"]

[entryPoints]
  [entryPoints.http]
    address = ":80"

  [entryPoints.https]
    address = ":443"

码头工人标签

  -l traefik.enable=true \
  -l traefik.http.middlewares.redirect.redirectregex.regex="^http://(.*)" \
  -l traefik.http.middlewares.redirect.redirectregex.replacement="https://\$1" \
  -l traefik.http.routers.web-redirect.rule="Host(\`domain.com\`)" \
  -l traefik.http.routers.web-redirect.entrypoints="http" \
  -l traefik.http.routers.web-redirect.middlewares="redirect" \
  -l traefik.http.routers.web-secure.rule="Host(\`domain.com\`)" \
  -l traefik.http.routers.web-secure.entrypoints="https" \

ELB监听器

enter image description here

答案 2 :(得分:0)

这就是我要做的。上面的答案是有帮助的,但是traefik不会启动,因为您实际上需要双精度\来在.toml中转义。

此外,您仍然需要确保那里具有正常的入口点和端口。 这是我完整的entryPoints部分:

[entryPoints]
  [entryPoints.http]
    address = ":80"
  [entryPoints.https]
    address = ":443"
  [entryPoints.http.redirect]
    regex = "^http:\\/\\/(www.)*(example\\.com)(.*)"
    replacement = "https://www.$2/$3"
    permanent = true
  [entryPoints.https.redirect]
    regex = "^https:\\/\\/(example.com)(.*)"
    replacement = "https://www.$1/$2"
    permanent = true
[entryPoints.https.tls]

答案 3 :(得分:0)

首先删除entrypoint,然后向您的http.redirect添加正则表达式/替换规则,例如:

[entryPoints.http.redirect]
regex = "^http://(?:www.)?site.example/(.*)"
replacement = "https://www.site.example/$1"

您删除entrypoint的原因是因为Traefik docs state

请注意,如果为重定向定义了regex,则不必在重定向结构中设置replacemententrypoint(在本指南中将不使用它们情况)

(加粗强调)

Traefik对语法非常宽容,因此您无需转义斜杠。括号内的?:使其成为不捕获组,因此replacement分配的值可以使用$1而不是$2

请注意,替换操作也使用域名前面的https方案。这是阻止第二次重定向的原因,因为替换规则是同时添加www和切换协议。

现在对https.redirect做同样的事情,像这样:

  [entryPoints.https.redirect]
    regex = "^https://(?:www.)?site.example/(.*)"
    replacement = "https://www.site.example/$1"

请注意,regex除了这次替换以外,还使用https方案。这就是常规重定向所需要的。要使重定向永久生效,您可以添加permanent = true以使用308重定向。


使用curl -I测试您的工作,并针对每个URL运行它。如果一切正常,您应该期望看到以下两种状态之一:

HTTP/1.1 308 Permanent Redirect
HTTP/2 200 

所有URL应该使用wwwhttps格式正确。对于Traefik 2.x,情况有所变化。升级时请参见Redirect non-www to www Traefik v2,以获取基于标签的方法。