HAProxy 1.6+:根据路径重写主机

时间:2016-04-17 16:04:55

标签: regex url-rewriting haproxy

我试图重定向所有类型的请求:

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. 新路径是不包括第一部分的原始路径
  3. 我很确定regexp可以解决这个问题,只是不确定如何基于另一个修改一个标头..

2 个答案:

答案 0 :(得分:0)

我不确定HAProxy是如何工作的,但我可以帮助你使用正则表达式。

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

您的新网址为\2.\1/\3

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

答案 1 :(得分:0)

起初我认为这可行:

# 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
#---------------

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

然后我尝试了这个:

# 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
#---------------

再一次,它几乎可以工作,但由于某种原因,主机没有得到适当的替换。

由于这只是由QA环境使用,并且行为与生产无关(静态。*,在我的情况下,将指向CDN),我认为现在这是一个充分的解决方案:

  <div id="toolbar" class="btn-group">
      <button class="btn btn-primary">
        Actions
      </button>
      <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
        <span class="caret"></span>
      </button>
      <ul class="dropdown-menu dropdown-menu-right">
          <li>
              <a href="#">Anuler</a>
          </li>
          <li>
              <a href="#">Sauvegarder</a>
          </li>
          <li class="dropdown dropdown-submenu"><a class="dropdown-toggle" href="#" data-toggle="dropdown">Payez</a>
              <ul class="dropdown-menu">
                  <li><a href="#">Comptant</a></li>
                  <li><a href="#">Débit</a></li>
                  <li><a href="#">Chèque</a></li>
              </ul>
          </li>
      </ul>
  </div>