Traefik v2 & PathPrefixStrip
В Traefik v1.х был такой замечательный Matcher - PathPrefixStrip. Он создавал маршрут /location
и обрезал эту часть из запроса, прежде чем направить запрос получателю. Проблема в том, что в Traefik версии 2 этот матчер выпилили и вместо него появились “middlewares”. Какое-то время я обходился костылем, который генерил огромные тэги для Consul сервиса и на основании оных применял StipPrefix middleware к матчеру PathPrefix, что не очень удобно, как минимум.
Но присев над задачей в очередной раз, я все же смог найти довольно лаконичное решение.
Дело в том, что мы можем подгружать middlewares из файла и применять его ко всем маршрутам. Вот этой возможностью мы и воспользуемся.
Создаем конфигурацию нашего middleware. Я буду использовать YAML, но думаю, что перевести в TOML при необходимости не составит труда.
http:
middlewares:
# Name of middleware could by any
stripprefixregex:
stripprefixregex:
regex: ^/[a-z-]+/
Теперь подключим эту конфигурацию в нашем основном config.yaml
.
providers:
consulCatalog:
endpoint:
address: http://consul.service.consul:8500
exposedByDefault: false
# Set default PathPrefix rule
defaultRule: "PathPrefix(`/{{ normalize .Name }}`)"
# Create file provider for our middleware
file:
filename: /local/middleware.yaml
entryPoints:
traefik:
address: ":8090"
http:
address: ":80"
forwardedHeaders:
insecure: true
# Setup default middlware for all routes
http:
middlewares:
# Use same name from middleware configuration
- stripprefixregex@file
Применяем, проверяем, палит!