Traefik: aplicar middleware al enrutador excepto una ruta específica
Utilizo un middleware de lista blanca de IP para filtrar el acceso de mi aplicación web solo a algunas IPs y funciona bien.
Sin embargo, quiero desproteger una ruta específica para hacerla pública (la ruta es /api/transaction).
Por ahora, tengo (en mi docker-compose.yml):
varnish:
labels:
– “traefik.http.routers.api_varnish.rule=Host(api.local
, api
)”
– “traefik.http.routers.api_varnish.tls=true”
– “traefik.http.routers.api_varnish.middlewares=https-redirect@file”
– “traefik.http.routers.api_varnish.middlewares=https-whitelist@file”
– “traefik.http.services.api_varnish.loadbalancer.server.port=80”
Esta parte funciona, luego añadí:
# Middleware abierto para llamadas de IPN de pago
– “traefik.http.routers.api_varnish_transaction.rule=(Host(api.local
, api
) && PathPrefix(/api/transaction
))”
– “traefik.http.routers.api_varnish_transaction.tls=true”
– “traefik.http.routers.api_varnish_transaction.priority=2”
– “traefik.http.routers.api_varnish_transaction.middlewares=https-redirect@file”
He duplicado las líneas, pero no apliqué el middleware https-whitelist@file al nuevo host.
No funciona, no puedo encontrar la sintaxis correcta o estar seguro si puedo hacerlo. La documentación es bastante pobre.
¿Alguna idea?
davy.ai
Dado que deseas desproteger una ruta específica y hacerla pública, debes eliminar el middleware
https-whitelist@file
del nuevo host.Para hacer esto, puedes utilizar la sección
traefik.http.middlewares
en tu archivodocker-compose.yml
para definir tus middlewares por separado y luego aplicarlos a tus hosts mediante etiquetas.Primero, define tus middlewares:
A continuación, aplica tus middlewares a los hosts:
En este ejemplo, el middleware
whitelist
está incluido en el enrutadorapi_varnish
, pero no en el enrutadorapi_varnish_transaction
. Solo el middlewarehttps-redirect
está incluido en ambos enrutadores.Al definir tus middlewares por separado y luego aplicarlos a tus hosts, puedes personalizar fácilmente el middleware para cada host y evitar la duplicación de código.