traefik 可以重写重定向响应的位置 header (302)

Can traefik rewrite the location header of redirect responses (302)

我在某些服务前使用 traefik 2.0.2 作为反向代理。一项后端服务正在返回重定向响应 (302),其中位置 header 包含绝对重定向 url。后台的url从外面是访问不到的,如何重写location再次通过反向代理?

例如客户端请求 http://my-domain/foo 并收到位置 header 包含 http://backend:8080/foo/bar/ 的 302 响应,这当然不会起作用。

我正在寻找类似于 traefik 的 ProxyPassReverse of apache mod_proxy. I have read through the available middlewares 的东西,但似乎没有任何东西符合我的要求。

我的简化配置:

# traefik.yml
entryPoints:
  web:
    address: ":80"

providers:
  file:
    filename: "dynamic-conf.yml"

# dynamic-conf.yml
http:
  routers:
    router1:
      entryPoints:
        - web
      service: service1
      rule: "PathPrefix(`/foo`)"
  services:
    service1
      loadBalancer:
        servers:
          - url: http://backend:8080

没有找到一个选项来使用 traefik 重写服务响应的位置header。 存在 replaceResponseHeaders 的功能请求。

我的(临时)解决方案是使用 RedirectRegex 中间件在 traefik 中执行重定向,这样后端服务就不需要响应重定向。

更新后的配置如下所示:

# dynamic-conf.yml
http:
  routers:
    router1:
      entryPoints:
        - web
      service: service1
      rule: "PathPrefix(`/foo`)"
      middlewares:
        - my-redirect
  middlewares:
    my-redirect: # Workaround for service1 redirection
      redirectRegex:
        regex: "^https?://[^/]+/foo/?$"
        replacement: "/foo/webapp/"
  services:
    service1
      loadBalancer:
        servers:
          - url: http://backend:8080

我和你有同样的问题,无法用你的解决方案解决它,但是现在,有了 traefik 插件,我们可以:

静态配置:

pilot:
  token: "xxxx"

experimental:
  plugins:
    rewriteHeaders:
      modulename: "github.com/XciD/traefik-plugin-rewrite-headers"
      version: "v0.0.2"

动态配置:

http:
  routes:
    my-router:
      rule: "Host(`localhost`)"
      service: "my-service"
      middlewares : 
        - "rewriteHeaders"
  services:
    my-service:
      loadBalancer:
        servers:
          - url: "http://127.0.0.1"
  middlewares:
    rewriteHeaders:
      plugin:
        rewriteHeaders:
          header: "Location"
          regex: "^http://(.+)$"
          replacement: "https://"

免责声明:我是插件的作者