我在某些服务之前使用traefik 2.0.2作为反向代理。一个后端服务正在返回重定向响应(302),其中位置标头包含绝对重定向的URL。后端的url无法从外部访问,如何重写位置以再次通过反向代理?
例如客户端请求http://my-domain/foo
并收到包含位置标头包含http://backend:8080/foo/bar/
的302响应,这当然是行不通的。
我正在寻找类似于apache mod_proxy的ProxyPassReverse的东西。我已经阅读了traefik的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
我的(临时)解决方案是使用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