【问题标题】:HAProxy 1.6+: rewrite host based on pathHAProxy 1.6+:根据路径重写主机
【发布时间】:2016-09-10 11:46:59
【问题描述】:

我正在尝试重定向所有类型的请求:

static.domain.com/site1/resource.jpg
static.domain.com/site1/resource2.js
static.domain.com/site2/resource3.gif
static.domain.com/site2/someDir/resource4.txt

site1.domain.com/resource.jpg
site1.domain.com/resource2.js
site2.domain.com/resource3.gif
site2.domain.com/someDir/resource4.txt

基本上,如果主机是static.domain.com:

  1. 新的子域基于原始路径的第一部分,具有相同的 TLD
  2. 新路径是不包括第一部分的原始路径

我很确定正则表达式可以解决这个问题,只是不确定如何根据另一个标题修改一个标题..

【问题讨论】:

    标签: regex url-rewriting haproxy


    【解决方案1】:

    起初我认为这可能有效:

    # Detect hosts of the format static.*
    acl host_static hdr_beg(host) -i static.
    
    # Style using reqirep
    # -------------
    # Replace "static.domain.com" with "someFolder.domain.com" if the host is static.* and the path has at least two / symbols
    # This causes: static.domain.com ===> whatever3.domain.com
    #reqirep ^([^\ :]*\ /)([^/]+)(/.*\n)(^(?:[a-zA-Z0-9()\-=\*\.\?;,+\/&_]+:\ .+\n)+)*Host:\ static\.([^/]+?)$ \1\2\3\4Host:\ \2.\5 if host_static
    #
    # Replace "/someFolder/" with "/" at the beginning of any request path, if the host is static.*
    # This causes: /whatever3/another/long/path ===> /another/long/path
    #reqirep ^([^\ :]*)\ /[^/]+/(.*)     \1\ /\2 if host_static
    #---------------
    

    但它没有按预期工作。正则表达式在受控测试中正常工作,但不能在 haproxy 本身中工作。可能是指令处理和执行顺序的问题。 (也许请求路径的修改会破坏第一个正则表达式?)

    然后我尝试了这个:

    # Style using set-var, set-path etc
    #---------------
    #http-request set-var(req.first_path_part)   path,field(2,/) if host_static
    #http-request set-var(req.last_host_part)    hdr(host),regsub(^static\.,) if host_static
    #http-request replace-header     Host        .* %[var(req.first_path_part)].%[var(req.last_host_part)] if host_static
    #http-request set-path                       %[path,regsub(^/.*?/,/)] if host_static
    #---------------
    

    再一次,它几乎可以工作,但由于某种原因主机没有被正确更换。

    由于这仅由 QA 环境使用,并且行为与生产环境不同(静态。*,在我的情况下,将指向 CDN),我认为这是一个足够的解决方案:

    # New style, using set-var and redirection.
    #---------------
    http-request set-var(req.first_path_part)   path,field(2,/) if host_static
    http-request set-var(req.last_host_part)    hdr(host),regsub(^static\.,) if host_static
    http-request redirect location https://%[var(req.first_path_part)].%[var(req.last_host_part)]%[path,regsub(^/.*?/,/)] code 302 if host_static
    #---------------
    

    【讨论】:

      【解决方案2】:

      我不确定 HAProxy 是如何工作的,但我可以帮助您处理正则表达式。

      试试:^static\.([^/]+)/([^/]+)/(.*)$

      您的新网址将是 \2.\1/\3

      请注意,您可能需要转义正则表达式中的 /s(这将使其变为 \/)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        • 2020-10-02
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        • 2014-06-10
        相关资源
        最近更新 更多