Переадресация без www на www с Traefik & Docker - PullRequest
0 голосов
/ 05 марта 2019

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

Исходя из этого комментария здесь , это должно указывать 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

Мой regex также выглядит хорошо для меня, 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"

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Что касается моего решения, я остановил подход в блоке 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"
0 голосов
/ 06 марта 2019

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

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

traefik.frontend.headers.SSLRedirect=true Принудительно перенаправляет веб-интерфейс на SSL при отправке запроса без SSL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...