使用 Traefik 通过正则表达式将 URL 重定向到另一个 URL

Dha*_*oti 2 docker docker-compose traefik

我想通过 traefik 将一个 URL 重定向到另一个 URL。

我正在使用 docker 进行此配置,下面是我的 docker-compose.yml 文件

version: '3'

services:
  reverse-proxy:
    # The official v2.0 Traefik docker image
    image: containous/whoami
    container_name: "whoami_cont"
    # Enables the web UI and tells Traefik to listen to docker
    ports:
      # The HTTP port
      - 80:80
      # The Web UI (enabled by --api.insecure=true)
      - 8080:8080
    labels:
      - traefik.http.middlewares.test-replacepathregex.replacepathregex.regex=^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]
      - traefik.http.middlewares.test-replacepathregex.replacepathregex.replacement=http://localhost:8081/4
Run Code Online (Sandbox Code Playgroud)

然后我成功运行 docker-compose 命令。然后我将点击匹配正则表达式模式的任何 URL,但 URL 没有根据配置重定向到另一个 URL - http://localhost:8081/4。我正在使用 traefik 2.0 版

如果缺少任何配置,请告诉我。

Yur*_*rov 6

按照官方示例,您的配置似乎缺少实际的 Traefik 实例:

  traefik:
    image: "traefik:v2.0.0-rc3"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
Run Code Online (Sandbox Code Playgroud)

在将 Traefik 添加到您的 docker-compose 文件并定义middleware 之后,您应该将您的中间件附加到路由器:

      - "traefik.http.routers.whoami.middlewares=test-replacepathregex"
      - "traefik.http.middlewares.test-replacepathregex.replacepathregex.regex=^/foo/(.*)"
      - "traefik.http.middlewares.test-replacepathregex.replacepathregex.replacement=/bar/$$1"
Run Code Online (Sandbox Code Playgroud)

替换/foo/123为的完整且有效(但简化)的示例/bar/123

version: "3.3"

services:
  traefik:
    image: "traefik:v2.0.0-rc3"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "containous/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`localhost`)"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.middlewares=test-replacepathregex"
      - "traefik.http.middlewares.test-replacepathregex.replacepathregex.regex=^/foo/(.*)"
      - "traefik.http.middlewares.test-replacepathregex.replacepathregex.replacement=/bar/$$1"
Run Code Online (Sandbox Code Playgroud)

  • 因为它不是重定向,所以它是一个替代:您在浏览器中看到相同的值,但后端看到另一个值(查看“whoami”响应)。如果需要重定向,请使用类似于replacepath中间件的重定向中间件。 (2认同)
  • 您很可能错误配置了中间件,需要进行调查。无论如何,问题的最初问题是您实际上并未将中间件连接到路由器。现在,当您附加它时,您可以开始调试下一个问题。 (2认同)