将 Traefik 前端重定向替换与 PathPrefixStrip 相结合

Combining Traefik frontend redirect replacement with PathPrefixStrip

我在 traefik.frontend.redirectPathPrefixStrip 之间遇到一些冲突。下面的 docker-compose.yml 文件总是将 www.mysite.nl/adminer 路由到 wordpress 容器。如果我省略重定向规则,它会正常工作,并且我会被路由到管理员实例。我怎样才能使这些规则协同工作?

向下钻取 docker-comose.yml

version: '3'
services:
  wordpress:
    image: wordpress:latest 
    restart: $RESTART
    container_name: ${COMPOSE_PROJECT_NAME}_wp
    depends_on:
      - mysql
    networks:
      - web
    labels:
      - 'traefik.backend=$COMPOSE_PROJECT_NAME'
      - 'traefik.entrypoint=https'
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:mysite.nl, www.mysite.nl, cdn.mysite.net'
       # omitting these rules make the adminer instance reachable
      - 'traefik.frontend.redirect.regex=^https?://mysite.nl/(.*)'
      - 'traefik.frontend.redirect.replacement=https://www.mysite.nl/$'
  mysql:
    image: mysql:latest
    restart: $RESTART
    container_name: ${COMPOSE_PROJECT_NAME}_db
    networks:
      - web
  adminer:
    image: adminer:4.6.2
    restart: $RESTART
    container_name: ${COMPOSE_PROJECT_NAME}
    depends_on:
      - mysql
    networks:
      - web
    labels:
      - 'traefik.backend=${COMPOSE_PROJECT_NAME}_adminer'
      - 'traefik.entrypoint=https'
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:www.mysite.nl;PathPrefixStrip:/adminer'

networks:
  web:
    external:
      name: traefik_${COMPOSE_PROJECT_NAME}_web

您 运行 遇到的问题是由于规则重叠。

要求www.mysite.nl/adminer

同时匹配: traefik.frontend.rule=Host:mysite.nl, www.mysite.nl, cdn.mysite.nettraefik.frontend.rule=Host:www.mysite.nl;PathPrefixStrip:/adminer

因此 Traefik 不知道将请求路由到哪个。

使用traefik.frontend.priority标签设置匹配顺序(来自https://docs.traefik.io/configuration/backends/docker/#on-containers

在 Daniel Tomcej 的帮助下,我开始了以下工作 docker-compose.yml。您必须在两个容器上明确设置优先级。

version: '3'
services:
  wordpress:
    image: wordpress:latest 
    restart: $RESTART
    container_name: ${COMPOSE_PROJECT_NAME}_wp
    depends_on:
      - mysql
    networks:
      - web
    labels:
      - 'traefik.backend=$COMPOSE_PROJECT_NAME'
      - 'traefik.entrypoint=https'
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:mysite.nl, www.mysite.nl, cdn.mysite.net'
      - 'traefik.frontend.redirect.regex=^https?://mysite.nl/(.*)'
      - 'traefik.frontend.redirect.replacement=https://www.mysite.nl/$'
      - 'traefik.frontend.priority=5'
  mysql:
    image: mysql:latest
    restart: $RESTART
    container_name: ${COMPOSE_PROJECT_NAME}_db
    networks:
      - web
  adminer:
    image: adminer:4.6.2
    restart: $RESTART
    container_name: ${COMPOSE_PROJECT_NAME}
    depends_on:
      - mysql
    networks:
      - web
    labels:
      - 'traefik.backend=${COMPOSE_PROJECT_NAME}_adminer'
      - 'traefik.entrypoint=https'
      - 'traefik.enable=true'
      - 'traefik.frontend.rule=Host:www.mysite.nl;PathPrefixStrip:/adminer'
      - 'traefik.frontend.priority=20'

networks:
  web:
    external:
      name: traefik_${COMPOSE_PROJECT_NAME}_web