Skip to content

Commit f9077d3

Browse files
authored
Traefik: introduce domain redirect (1st version) (#925)
* Traefik: introduce domain redirect * Fix env vars * Update CI deps * Updates * Revert CI changes
1 parent 6f90f13 commit f9077d3

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

services/traefik/docker-compose.yml.j2

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,35 @@ services:
146146
- traefik.http.middlewares.strip-www.redirectregex.replacement=$${1}://$${2}
147147
- traefik.http.middlewares.strip-www.redirectregex.permanent=true
148148
149+
150+
###
151+
# Domain redirects
152+
###
153+
{% set redirect_from_domains_list = TRAEFIK_DOMAINS_REDIRECT_FROM.split(',') %}
154+
{% set redirect_to_domains_list = TRAEFIK_DOMAINS_REDIRECT_TO.split(',') %}
155+
{% set redirect_is_permanent_list = TRAEFIK_DOMAINS_REDIRECT_IS_PERMANENT.split(',') %}
156+
157+
{% for ix in range(redirect_from_domains_list | length) %}
158+
159+
{% set from_domain = redirect_from_domains_list[ix] %}
160+
{% set from_domain_no_dots = from_domain.replace(".", "-") %}
161+
{% set to_domain = redirect_to_domains_list[ix] %}
162+
{% set redirect_is_permanent = redirect_is_permanent_list[ix] %}
163+
164+
# Regex below is redirecting any subdomains and path to new domain.
165+
# Use https://regex101.com/r/58sIgx/2 for regex explanation and experimentation.
166+
# Below we include dollar escaping and j2 expressions. It is not clean / pure regex
167+
# You can fetch baked and clean regex from traefik dashboards.
168+
- traefik.http.middlewares.redirect-{{ from_domain_no_dots }}.redirectregex.regex=^https?://((?:[a-zA-Z0-9-]+\.)*)*{{ from_domain }}(.*)$$
169+
- traefik.http.middlewares.redirect-{{ from_domain_no_dots }}.redirectregex.replacement=https://$${1}{{ to_domain }}$${2}
170+
- traefik.http.middlewares.redirect-{{ from_domain_no_dots }}.redirectregex.permanent={{ redirect_is_permanent }}
171+
- traefik.http.routers.{{ from_domain_no_dots }}.rule={{ generate_domain_capture_all_rule(from_domain) }}
172+
- traefik.http.routers.{{ from_domain_no_dots }}.middlewares=redirect-{{ from_domain_no_dots }}
173+
- traefik.http.routers.{{ from_domain_no_dots }}.entrypoints=https
174+
- traefik.http.routers.{{ from_domain_no_dots }}.tls=true
175+
176+
{% endfor %}
177+
149178
networks:
150179
public: null
151180
monitored: null
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
def _generate_domain_capture_all_rule(domain: str) -> str:
2+
rules = [
3+
f"Host(`{domain}`)",
4+
f"Host(`www.{domain}`)",
5+
f"Host(`invitations.{domain}`)",
6+
f"Host(`services.{domain}`)",
7+
f"HostRegexp(`{{subhost:[a-zA-Z0-9-]+}}.services.{domain}`)",
8+
f"Host(`services.testing.{domain}`)",
9+
f"HostRegexp(`{{subhost:[a-zA-Z0-9-]+}}.services.testing.{domain}`)",
10+
f"Host(`pay.{domain}`)",
11+
f"Host(`api.{domain}`)",
12+
f"Host(`api.testing.{domain}`)",
13+
f"Host(`testing.{domain}`)",
14+
]
15+
return " || ".join(rules)
16+
17+
18+
def j2_environment(env):
19+
env.globals.update(
20+
generate_domain_capture_all_rule=_generate_domain_capture_all_rule
21+
)
22+
return env

services/traefik/template.env

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,7 @@ MONITORED_NETWORK=${MONITORED_NETWORK}
3737

3838
WEBSERVER_HOST=${WEBSERVER_HOST}
3939
WEBSERVER_PORT=${WEBSERVER_PORT}
40+
41+
TRAEFIK_DOMAINS_REDIRECT_FROM=${TRAEFIK_DOMAINS_REDIRECT_FROM}
42+
TRAEFIK_DOMAINS_REDIRECT_TO=${TRAEFIK_DOMAINS_REDIRECT_TO}
43+
TRAEFIK_DOMAINS_REDIRECT_IS_PERMANENT=${TRAEFIK_DOMAINS_REDIRECT_IS_PERMANENT}

0 commit comments

Comments
 (0)