鉴于以下情况:
/
这意味着应用程序将重定向到
/login
并将资产作为 /style.css
提供服务,但从互联网上,这些资源将作为 /customprefix/login
和 /customprefix/style.css
进行访问。
SSL 在反向代理处终止,预计也会去除前缀。使用 Nginx 或 Apache 这不会有问题(例如使用 Nginx
ProxyPass
)。但是,我想使用 Traefik 作为反向代理,但我找不到正确的中间件组合来实现这一点:
Traefik 的
StripPrefix
正确地将 /customprefix/...
映射到 /...
,但这仅适用于请求。后端的响应保持不变,所有路径都指向/
,而不是被重写为/customprefix
。
我怎样才能让 Traefik 重写响应......?:
将我的评论转化为答案:
如何使用 nginx 或 apache 解决这个问题?要实现这项工作,需要从后端过滤 HTML 来重写链接(例如,类似
mod_proxy_html
的内容,即使在这种情况下,当使用 Javascript 动态生成链接时通常也会失败(因为这是在客户端浏览器中运行,因此您的代理管道具有没有机会更改结果)。
我想说,后端要么需要知道前缀,要么需要使用相对较小的、众所周知的路径集,以便您可以在前端为所有这些路径创建适当的重定向。
如果可以选择,您可以使用基于主机而不是基于路径的规则将流量定向到后端,在这种情况下,您可以根据需要重定向所有路径。
我现在正在处理一个类似的用例,我使用 using HeadersRegexp
和
Referer
标题(像这里)使它部分工作:
"traefik.http.routers.customprefix.rule=PathPrefix(`/customprefix`) || HeadersRegexp(`Referer`, `.*\\/customprefix\\/.*`)",
"traefik.http.routers.customprefix.middlewares=customprefix",
"traefik.http.middlewares.customprefix.stripprefix.prefixes=/customprefix",
它正确地映射了一些路线,但其他路线则失败了。试一试。无论如何,我同意@larsks评论。
注意:我正在使用Nomad进行部署,它解析
hcl
,在其他情况下,您可能需要使用不带双\\
的正则表达式,例如.*\/customprefix\/.*
我花了很多时间尝试使用 Traefik 和 Nginx 来寻找解决方案。
当最终在登录页面中使用 Nginx 实现了预期的结果时,我很快意识到前面还有其他几个障碍:例如,页面链接的 href 都指向
/
路径,使得一切都崩溃了点击。
最后,我决定放弃这个原因并遵循@larsks的建议:而不是尝试在路径中使用我的应用程序
example.com/path1/
我开始在path1.example.com/
中提供它