首页 > 解决方案 > haproxy 重写以完全替换主机名并默认重定向基本 url 到登录

问题描述

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

例子:

portal.company1.com --> 默认情况下,这是公司 1 用于登录的主要 URL。我们创建租户,然后允许他们在没有虚 url 的情况下访问 portal.company1.com/login/account/company2,一旦登录应用程序,就会将 /login/account/company2 放在一起,只利用后续的 portal.company1.com/

我们希望将 lod.company2.com 指向我们的 haproxy 并重写 URL,以便它完全用新的虚 url 替换 portal.company1.com,他们可以在新 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 - 它会将他们带到他们的租户登录。利用该主机名作为重写而不是重定向。目标是掩盖底层的portal.company1.com,但仍然在后端拥有一切功能。

标签: url-rewritinghaproxy

解决方案


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

我们在前端需要的一行。

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

我们在后端需要两行

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

推荐阅读