如何结合PathPrefixStrip与Redirect:Regex?Traefik重定向异常求助
我帮你梳理下问题的核心:你用的是Traefik v1版本,它的执行逻辑是先处理前端规则里的PathPrefixStrip,再执行EntryPoint层面的重定向。这就导致当用户发http://my.domain/mypath/somepage请求时,Traefik先把路径剥成/somepage,再去匹配你EntryPoint里的重定向正则http://my.domain/(.*)$,最后重定向出来的URL就丢了/mypath/前缀,自然会出问题。
下面给你两个靠谱的解决方案,按需选择:
方案1:调整重定向正则适配路径剥离后的结果
既然路径已经被提前剥离了,那我们直接在重定向的替换规则里补回/mypath/前缀就行,前端规则保持不变:
# 前端规则保留PathPrefixStrip traefik.frontend.rule=Host:my.domain;PathPrefixStrip:/mypath/ # 修改EntryPoint的重定向配置,补回路径前缀 traefik param --entrypoints="Name:http Address::80 Redirect.EntryPoint:https Redirect.Regex:http://my.domain/(.*)$ Redirect.Replacement:https://my.domain/mypath/$1 Redirect.Permanent:true"
这样流程就变成:HTTP请求进来→路径被剥成/somepage→重定向到https://my.domain/mypath/somepage→HTTPS请求进来→再次被PathPrefixStrip剥成/somepage传给后端,逻辑是通顺的。
方案2:分离重定向与路径剥离逻辑(更推荐)
把HTTP重定向和路径剥离拆到两个前端配置里,让重定向先完成,再处理路径剥离,避免顺序冲突:
# HTTP前端:只做重定向,不碰路径 traefik.http.frontend.rule=Host:my.domain traefik.http.frontend.redirect.entryPoint=https traefik.http.frontend.redirect.regex=http://my.domain/(mypath/.*)$ traefik.http.frontend.redirect.replacement=https://my.domain/$1 traefik.http.frontend.redirect.permanent=true # HTTPS前端:专门处理路径剥离 traefik.https.frontend.rule=Host:my.domain;PathPrefixStrip:/mypath/ traefik.https.frontend.entryPoints=https
这种方式逻辑更清晰,HTTP请求直接被重定向到完整的HTTPS路径,没有中间的路径修改干扰,HTTPS请求再单独处理路径剥离,后端拿到的就是正确的路径。
小提示
如果你已经升级到Traefik v2+,建议用Middleware来处理这类逻辑,比如先用redirectScheme做HTTP转HTTPS,再用stripPrefix处理路径,通过middlewares参数指定执行顺序,比v1的配置更直观可控。
测试的时候可以用curl -v http://my.domain/mypath/test查看响应头里的Location字段,确认重定向的URL是否符合预期。
内容的提问来源于stack exchange,提问作者ivarec

