Что такое эквивалент Traefik для «перезаписываемой базы /api» Apache?

#mod-rewrite #docker-compose #traefik

Вопрос:

Я близок к настройке своего traefik с помощью docker-составьте, чтобы сделать следующее:

  • Проложите http://team1.example.com/api/lt;any pathgt; маршрут к контейнеру api nodejs
  • Проложить http://team1.example.com/lt;any path except apigt; маршрут к веб-контейнеру

У меня просто возникли проблемы с тем, чтобы traefik перенаправлял запросы в мой контейнер api с помощью соответствующего rewritebase .

Вот мои два файла docker compose, которые вы можете запустить:

 # docker-compose.traefik.yml version: '3'  services:  traefik:  image: traefik:v2.5.4  command:  - "--providers.docker"  - "--providers.docker.swarmMode=true"  - "--providers.docker.exposedByDefault=false"  ports:  - 80:80  volumes:  - /var/run/docker.sock:/var/run/docker.sock:ro  networks:  - mynet networks:  mynet:  external: true  # docker-compose.yml version: '3'  services:  ui:  image: johnlai2004/swarm-ui:latest  deploy:  labels:  - "traefik.enable=true"  - "traefik.http.routers.${STACK_NAME}_ui.rule=Host(`${APP_HOST}`) amp;amp; !PathPrefix(`/api{regex:$|/.*}`)"  - "traefik.http.services.${STACK_NAME}_ui.loadbalancer.server.port=80"  depends_on:  - api  networks:  - mynet  api:  image: johnlai2004/swarm:latest  environment:  - "DB=${STACK_NAME}_db"  deploy:  labels:  - "traefik.enable=true"  - "traefik.frontend.rule=PathPrefixStrip(`/api`);"  - "traefik.http.routers.${STACK_NAME}_api.rule=Host(`${APP_HOST}`) amp;amp; PathPrefix(`/api{regex:$|/.*}`)"  - "traefik.http.services.${STACK_NAME}_api.loadbalancer.server.port=3000"  depends_on:  - db  networks:  - mynet   db:  image: mongo:4.0.3  networks:  - mynet  networks:  mynet:  external: true   

Чтобы все было запущено и запущено, вы просто выполняете эти команды:

 docker swarm init; docker network create --driver overlay mynet; docker stack deploy -c docker-compose.traefik.yml traefik; STACK_NAME=team1 APP_HOST=team1.example.com docker stack deploy -c docker-compose.yml team1;  # Replace the value `team1.example.com` with the host of your server.  

ПРОБЛЕМА: Когда я прихожу http://team1.example.com/api/subdir , я получаю сообщение Cannot GET /api/subdir . Мой контейнер api NodeJS обслуживает Cannot GET /api/subdir . Проблема в том, что мне нужно сделать эквивалент Apache RewriteBase /api , чтобы мой маршрутизатор NodeJS express работал должным образом. Маршрутизатор nodejs express ожидает /subdir вместо /api/subdir . Я попытался использовать traefik.frontend.rule=PathPrefixStrip( /api ); , но это никак не повлияло на ситуацию

Кто-нибудь знает, как я могу обойти эту проблему?