起因:旧站 从 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的代码应该如下:
~/traefik2/data/configurations/dynamic.yml
# 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