Traefik을 사용하여 www가 아닌 ​​곳에서 www로 리디렉션하는 방법

나는 최근에 내 개인 블로그의 호스팅 제공업체를 Netlify 에서 내 사용자 지정 스택( Docker , PortainerTraefik )으로 전환했으며 마이그레이션에서 뭔가를 잊어버렸음을 빠르게 알아차렸습니다: benjaminrancourt.ca에서 리디렉션 www.benjaminrancourt.ca ... 😟

내 웹 사이트에 canonical link elements이 있고 동일한 웹 사이트가 두 도메인 모두에 대해 제공되었지만 이 작은 기능을 잃어버렸다는 것이 저를 괴롭혔습니다... 그래서 자연스럽게 Traefik으로 이 리디렉션을 구현하는 방법을 인터넷에서 검색하기 시작했습니다. 😇

불행히도 Traefik 커뮤니티는 과거에 비슷한 질문을 여러 번 했지만( 5425 , 6458 , 6813 , 8409 , 7428 , 897610711 솔루션을 제안한 적이 없습니다. 내 환경을 위해 일했습니다 ... 😢

대부분은 labels 로 새로운 미들웨어를 정의하지만, 저는 일부 사이트에만 적용할 수 있는 보다 글로벌한 솔루션을 찾고 있었습니다. 리다이렉트를 필요로 하는 모든 웹사이트의 리다이렉트를 해결하기 위해 새로운 미들웨어를 만드는 것은 그다지 효율적이지 않다고 생각했습니다... 🤔

특히 솔루션이 모두 같지는 않았지만 서로 비슷했습니다.

  - "traefik.http.middlewares.wwwtohttps.redirectregex.regex=^https?://(?:www\\.)?(.+)"
  - "traefik.http.middlewares.wwwtohttps.redirectregex.replacement=https://$${1}"
  - "traefik.http.middlewares.wwwtohttps.redirectregex.permanent=true"



그들 중 일부는 마침표를 두 번 이스케이프 처리하고( \\. ), 일부는 마침표를 한 번만 이스케이프 처리하고( \. ), 나머지는 마침표를 이스케이프하지 않습니다( . )... 이중 달러 기호( $${1} and ${1} )... 어느 것이 맞나요? 약간 혼란스럽죠? 😵

그래서 여러 조합을 시도하기 시작했고 라이브 웹사이트를 몇 번 중단한 후 마침내 작동하게 되었습니다! 다음은 Traefik v2.5.1에서 작동하는 솔루션입니다. 🎉

해결책



위에서 말했듯이 dynamic configuration file에서 미들웨어를 한 번만 정의합니다.

# Traefik dynamic configuration file
# See https://doc.traefik.io/traefik/getting-started/configuration-overview/#the-dynamic-configuration

http:
  middlewares:
    # Redirect non-www URLs to their www equivalent
    # Use with traefik.http.routers.myRouter.middlewares: "redirect-non-www-to-www@file"
    redirect-non-www-to-www:
      # Redirect a request from an url to another with regex matching and replacement
      redirectregex:
        # Apply a permanent redirection (HTTP 301)
        permanent: true
        # The regular expression to match and capture elements from the request URL
        regex: "^https?://(?:www\\.)?(.+)"
        # How to modify the URL to have the new target URL
        replacement: "https://www.${1}"

    # Redirect www URLs to their non-www equivalent
    # Use with traefik.http.routers.myRouter.middlewares: "redirect-www-to-non-www@file"
    redirect-www-to-non-www:
      # Redirect a request from an url to another with regex matching and replacement
      redirectregex:
        # Apply a permanent redirection (HTTP 301)
        permanent: true
        # The regular expression to match and capture elements from the request URL
        regex: "^https?://www\\.(.+)"
        # How to modify the URL to have the new target URL
        replacement: "https://${1}"



내 의견에서 이미 사용 방법을 보았을 수도 있지만 docker-compose.yml 파일에 새 레이블을 추가하기만 하면 됩니다.

  traefik.http.routers.myRouter.middlewares: "redirect-non-www-to-www@file"



라우터에 이미 미들웨어가 있는 경우 , 와 같이 쉼표( another-middleware,redirect-non-www-to-www@file )로 구분하여 원하는 미들웨어를 추가하십시오.

이제 웹사이트를 www 또는 non-www으로 리디렉션할 수 있습니다. 🤗

좋은 웹페이지 즐겨찾기