haproxy 重写以完全替换主机名并默认将 base url 重定向到登录

haproxy rewrite to completely replace host name and redirect base url by default to login

用例: 需要为白标服务创建虚拟主机名。需要重写 URL 以便一切正常,只是新的 URL。我想最初将用户推送到特定子租户的登录,然后登录后可以继续正常使用。

示例:

portal.company1.com --> 默认情况下,这是公司 1 用于登录的主要 URL。我们创建租户,然后允许他们毫无虚荣地 url 转到 portal.company1。com/login/account/company2 一旦登录应用程序,就会将 /login/account/company2 全部放在一起,并只利用继续的门户。company1.com/

我们想要将 lod.company2.com 指向我们的 haproxy 并重写 URL 以便它完全取代 portal.company1.com 和新的虚荣心 url 和他们可以在他们的新 URL 下访问他们的租户。

到目前为止,我一直在查看许多不同的堆栈溢出以找到执行此操作的方法,这有点困难。

使用下面列出的不同测试进行配置: 明白这些没有用……只是把它们放在身边以展示我到目前为止的工作。

frontend https_443_frontend
        mode http
        # --- TESTS SO FAR --- ###   
        #http-request replace-value Host portal.company1.com lod.company2.com if { hdr(host) -i lod.company2.com }
        #redirect prefix portal.company1.com code 301 if { hdr(host) -i lod.company2.com }
        #http-request set-header Host lod.company2.com if {hdr(host) -i lod.company2.com }
        #http-request replace-header Host portal.company1.com/login/company2 lod.company2.com if { hdr(host) -i lod.company2.com }
        #redirect prefix https://portal.company1.com code 301 if { hdr(host) -i lod.company2.com }

        acl host_company1_portal_443 hdr(host) -i portal.company1.com
        acl host_lod.company2.com_443 hdr(host) -i lod.company2.com
        use_backend apptier_backend if host_company1_portal_443
        use_backend lod_company2 if host_lod.company2.com_443

backend lod_company2
        mode http
       # option httpclose
       # option forwardfor

        # http-request set-header Host lod.company2.com if { hdr(host) -i portal.company1.com }
        #cookie SERVERID insert indirect nocache
                #########
        #http-request replace-value Host portal.company1.com lod.company2.com if { hdr(host) -i lod.company2.com }

        #redirect prefix portal.company1.com/login/company2 code 301 if { hdr(host) -i lod.company2.com }
        #http-request set-header Host lod.company2.com if {hdr(host) -i lod.company2.com }
        http-request replace-header Host portal.company1.com lod.company2.com if { hdr(host) -i lod.company2.com }
        #redirect prefix https://portal.company1.com/login/company2 code 301 if { hdr(host) -i lod.company2.com }

最终目标:

当用户点击 lod 时。company2.com -- 它会将他们带到他们的租户登录。利用该主机名作为重写而不是重定向。目标是屏蔽底层门户。company1.com 但仍然在后端运行所有功能。

好的,经过几轮尝试解决这个问题...我们终于找到了一个似乎有效的解决方案。

我们在前端需要的一行。

http-request replace-value Location ^portal.company1.com(.*) lod.company2.com if { hdr(host) -i lod.company2.com }

后端需要两条线

http-request replace-value Location ^https://lod.company2.com(.*)$ https://portal.company1.com
http-response replace-value Location ^https://portal.company1.com(.*)$ https://lod.company2.com