#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"