【问题标题】:Redirect URL to another URL by regex with Traefik使用 Traefik 通过正则表达式将 URL 重定向到另一个 URL
【发布时间】:2020-01-08 12:50:49
【问题描述】:

我想通过 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 - http://localhost:8081/4 根据配置。 我正在使用 traefik 2.0 版

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

【问题讨论】:

  • containous/whoami 并不是真正的 Traefik docker 镜像,它只是一个用于测试的简单服务器。
  • 那我应该使用哪张图片呢?我已经尝试过 traefik:v2.1.0 图像,但它不起作用。

标签: docker docker-compose traefik


【解决方案1】:

official example 之后,您的配置似乎缺少一个实际的 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 文件并定义 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"

/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"

【讨论】:

  • 感谢尤里。它构建成功,但是当我点击 URL 时,它没有重定向到替换 URL。我可以看到官方示例中显示的 whoami 服务的输出,但没有发生 URL 重定向。
  • 因为它不是重定向,所以它是一个替换:您在浏览器中看到相同的值,但后端看到另一个值(查看whoami回复)。如果需要重定向,使用类似于replacepath中间件的redirect中间件。
  • 谢谢尤里。 whoami 服务的响应非常适合替换,但是当我使用重定向中间件时,浏览器 URL 没有重定向并且 404 页面未找到显示。有什么想法吗?
  • 您很可能错误地配置了中间件并需要查看它。无论如何,问题中的原始问题是您实际上并未将中间件附加到路由器。现在,当您附加它时,您可以开始调试下一个问题。
  • 是的,Yury,关于将中间件附加到路由器是正确的。我错过了这部分。现在我可以使用您提供的示例成功重定向它。感谢您的热心帮助。
【解决方案2】:

如果您使用Ingressroute,这非常简单。假设我想使用 traefik 从example.com 重定向到app.example.com

首先要创建一个中间件:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: example-redirectregex
spec:
  redirectRegex:
    regex: ^https://example.com/(.*)
    replacement: https://app.example.com/${1}

如果您已经有Ingressroute,那么您可以添加一个附加规则,将example.com 指向app.example.com 使用的同一后端服务,并使用我们在上面创建的中间件

- kind: Rule
    match: Host(`example.com`)
    middlewares:
    - name: example-redirectregex
      namespace: traefik
    services:
    - kind: Service
      name: master-prod
      namespace: app-web
      port: 80

所以,最后你的Ingressroute 应该如下所示:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  generation: 3
  labels:
    app: app-web
    product: example.com
  name: example-com
  namespace: traefik
spec:
  entryPoints:
  - websecure
  routes:
  - kind: Rule
    match: Host(`example.com`)
    middlewares:
    - name: example-redirectregex
      namespace: traefik
    services:
    - kind: Service
      name: example
      namespace: app-web
      port: 80
  - kind: Rule
    match: Host(`app.example.com`)
    services:
    - kind: Service
      name: example
      namespace: app-web
      port: 80
  tls:
    secretName: cert-example-com

现在,如果您浏览 example.com,它应该会将您重定向到 app.example.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2018-09-10
    • 2021-04-06
    • 1970-01-01
    • 2020-03-28
    • 2017-01-05
    • 1970-01-01
    相关资源
    最近更新 更多