起因:旧站 从 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}"

Traefik non-www 重定向 www 过程记录

关于 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

Traefik non-www 重定向 www 过程记录