Перенаправлять не-www на www с помощью Traefik

#docker #docker-compose #traefik

#docker #docker-создать #traefik

Вопрос:

В Интернете в разных местах опубликовано несколько решений для решения моей проблемы, поэтому я прошу здесь посмотреть, сможет ли кто-нибудь заметить мою ошибку.

Основываясь на этом здесь комментарии, это должно перенаправить www на не-www:

 - traefik.frontend.rule=Host:example.com,www.example.com
- traefik.frontend.redirect.regex=^https?://www.example.com/(.*)
- traefik.frontend.redirect.replacement=https://example.com/$${1}
  

Итак, я просто изменил поведение для достижения моего варианта использования. Смотрите блок меток ниже.

Но это не работает. Текущее поведение:

http://example.com -> https://example.com (Неожиданно)

https://example.com -> https://example.com (Неожиданно)

http://www.example.com -> https://www.example.com (GTG)

https://www.example.com -> https://www.example.com (GTG

Я хочу, чтобы все указывало наhttps://www.example.com

Вот мой файл docker-compose:

 version: "2"
services:

  app: 
    build:
      context: .
      dockerfile: Dockerfile-SSR-AngularApp
    environment: 
      - PORT=5200
    restart: always
    networks:
      - web
      - default
    expose:
      - "5200"
    labels:
      - traefik.enable=true
      - traefik.docker.network=web
      - traefik.basic.port=5200
      - traefik.basic.frontend.rule=Host:www.example.com,example.com
      - traefik.frontend.redirect.regex=^https?://example.com/?(.*) # I flipped these from the example to meet my use case
      - traefik.frontend.redirect.replacement=https://www.example.com$${1}
      - traefik.frontend.redirect.permanent=true
      - traefik.frontend.headers.SSLRedirect=true
      - traefik.frontend.headers.SSLForceHost=true
      - traefik.frontend.headers.SSLHost=www.example.com

networks:
  web:
    external: true
  

Мое регулярное выражение также мне нравится, Regex101

Есть идеи о том, почему эта конфигурация работает не так, как ожидалось?

Обновить:

Это ответы, которые я получаю от этих запросов:

 curl --head http://example.com
HTTP/1.1 302 Found -> This is the redirect from http to https
Location: https://example.com:443/
Date: Tue, 05 Mar 2019 14:30:29 GMT
Content-Length: 5
Content-Type: text/plain; charset=utf-8


curl --head https://example.com
HTTP/2 200 -> NO REDIRECT, should be 301
content-type: text/html; charset=utf-8
date: Tue, 05 Mar 2019 14:32:16 GMT
etag: W/"74c55-CIDAqU2YBPjLVCS1Hegttk4cLvI"
vary: Accept-Encoding
x-powered-by: Express
content-length: 478293
  

Вот мой файл traefik.toml:

 debug = false

logLevel = "ERROR"
defaultEntryPoints = ["https","http"]

[entryPoints]
[entryPoints.http]
address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
[entryPoints.https]
address = ":443"
compress = true
[entryPoints.https.tls]

[retry]

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "www.example.com"
watch = true
exposedByDefault = false

[acme]
email = "me@example.com"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"
  

Это решение, к которому я пришел в итоге

 debug = false

logLevel = "ERROR"
defaultEntryPoints = ["https","http"]

[entryPoints]
[entryPoints.http]
address = ":80"
    [entryPoints.http.redirect]
      #entryPoint = "https"
      regex = "^http://example.com/(.*)"
      replacement = "https://www.example.com/$1"
[entryPoints.https]
address = ":443"
compress = true
    [entryPoints.https.redirect]
      regex = "^https://example.com/(.*)"
      replacement = "https://www.example.com/$1"
    [entryPoints.https.tls]

[retry]

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "www.example.com"
watch = true
exposedByDefault = false

[acme]
email = "me@example.com"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"
  

Комментарии:

1. @Idez, не могли бы вы ответить на мой вопрос? Любое направление было бы с благодарностью.

Ответ №1:

set traefik.frontend.headers.SSLRedirect=false или Traefik добавят правило перенаправления для всех http запросов к одним и тем же запросам с https перед применением вашего регулярного выражения.

Из документации Traefik docker:

traefik.frontend.headers.SSLRedirect=true Заставляет интерфейс перенаправлять на SSL, если отправляется запрос, отличный от SSL.

Комментарии:

1. Спасибо за помощь! Я установил SSLRedirect=false, однако он по-прежнему ведет себя так же.

Ответ №2:

Для моего решения я закончил тем, что отказался от подхода в labels блоке моего файла docker-compose. Если кто-то предложит решение для этого, я заинтересован. Тем временем я придумал решение, которое подходит для моего упрощенного случая. Вместо выполнения перенаправления в контейнере, я выполняю его в точках входа для Traefik в моем конфигурационном файле traefik.toml:

 debug = false

logLevel = "ERROR"
defaultEntryPoints = ["https","http"]

[entryPoints]
[entryPoints.http]
address = ":80"
    [entryPoints.http.redirect]
      #entryPoint = "https"
      regex = "^http://example.com/(.*)"
      replacement = "https://www.example.com/$1"
[entryPoints.https]
address = ":443"
compress = true
    [entryPoints.https.redirect]
      regex = "^https://example.com/(.*)"
      replacement = "https://www.example.com/$1"
    [entryPoints.https.tls]

[retry]

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "www.example.com"
watch = true
exposedByDefault = false

[acme]
email = "me@example.com"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"