起因:旧站 从 http:// 经过 traefik 自动实现 https://,本来可以由nginx实现 有www和无www的跳转。但想到Traefik的介绍就是有反代功能,能否直接从traefik捕获请求并重定向。
网上查到的内容大至如下:
# Redirect non-www to www middleware
- traefik.http.middlewares.mydomain-nonwww.redirectregex.regex=^https://mydomain.com/(.*)
- traefik.http.middlewares.mydomain-nonwww.redirectregex.replacement=https://www.mydomain.com/$${1}
- traefik.http.middlewares.mydomain-nonwww.redirectregex.permanent=true
- traefik.http.routers.mydomain.middlewares=gzip@docker,mydomain-nonwww@docker
更多的讨论,请看原地址:
https://www.reddit.com/r/Traefik/comments/eo1lu1/www_nonwww_redirect_for_traefix_2x/fegapyp/
上面代码大致意思,就是通过router的 middleware 中间件的 redirectregex实现重定向,用 lable通过docker file实现。
现改为本站使用的 docker file结构。
先找到 redirectregex的官方使用说明:
https://doc.traefik.io/traefik/middlewares/redirectregex/
# Redirect with domain replacement
http:
middlewares:
test-redirectregex:
redirectRegex:
regex: "^http://localhost/(.*)"
replacement: "http://mydomain/${1}"
由于已经实现traefik 自动https, 所以在~/traefik2/data/configurations/dynamic.yml
中添加的 middlewares的代码应该如下:
# nonwww-www
nonwww-www:
redirectregex:
regex: "^https://domain.com/(.*)"
replacement: "https://www.domain.com/${1}"
关于 regex 的语法,更多的可在 官方推荐的网页检查:
https://regex101.com/r/58sIgx/2
添加完 middlewares,~/traefik2/data/configurations/dynamic.yml
中还需要在router 的rules中引用 这个中间件。
http:
routers:
...
# 找到对应router位置,添加相应的middlewares
# Roter4: discuz/bbs
discuz-1:
entryPoints:
- "websecure"
middlewares:
- "nonwww-www"
rule: "Host(`www.domain.com`) || Host(domian.com`)"
service: discuz-service