Traefik v2 & PathPrefixStrip

1 мин

В 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

Применяем, проверяем, палит!