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

Docker 使用Traefik通过正则表达式将URL重定向到另一个URL,docker,docker-compose,traefik,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 t

我想通过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
然后我成功运行docker compose命令。然后,我将点击任何匹配正则表达式模式的URL,但该URL不会重定向到另一个URL-根据配置。 我使用的是traefik 2.0版

如果缺少任何配置,请通知我。

下面,您的配置似乎缺少一个实际的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"
将Traefik添加到docker compose文件并定义后,应将中间件连接到路由器:

      - "traefik.http.routers.whoami.middlewares=test-replacepathregex"
      - "traefik.http.middlewares.test-replacepathregex.replacepathregex.regex=^/foo/(.*)"
      - "traefik.http.middlewares.test-replacepathregex.replacepathregex.replacement=/bar/$$1"
/bar/123
替换
/foo/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"

containous/whoami
不是真正的Traefik docker映像,它只是一个用于测试的简单服务器。那么我应该使用哪个映像?我尝试过traefik:v2.1.0图像,但没有成功。谢谢你的帮助。它构建成功,但当我点击URL时,它并没有重定向到替换URL。我可以看到whoami服务的输出,如官方示例所示,但URL重定向没有发生。因为它不是重定向,所以它是一个替换:您在浏览器中看到相同的值,但后端看到另一个值(查看
whoami
response)。如果您需要重定向,请使用类似于replacepath中间件的重定向中间件。谢谢。whoami服务的响应非常适合替换,但当我使用重定向中间件时,浏览器URL并没有重定向,并且显示404页面未找到。对此有什么想法吗?很可能是您错误配置了中间件,需要对此进行调查。无论如何,问题的原始问题是,您实际上没有将中间件连接到路由器。现在,当您连接它时,就可以开始调试下一个问题了。是的,Yury,关于将中间件连接到路由器,您是正确的。我错过了这部分。现在,我能够通过您提供的示例成功地重定向它。谢谢你的帮助。