2016-04-17 4 views
-1

Ich versuche, alle vom Typ angefordert zu umleiten:HAProxy 1.6+: host umschreiben basierend auf dem Pfad

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 

zu

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

Grundsätzlich, wenn die Host static.domain.com ist:

  1. New Sub-Domain auf dem ersten Teil des ursprünglichen Pfades basiert, mit dem gleichen TLD
  2. Neuer Pfad ist der ursprüngliche Pfad

Ich bin ziemlich sicher, dass regexps dieses Problem lösen kann, nur nicht sicher, dass der erste Teil nicht darunter, wie ein Header basierend auf einem anderen ändern ..

Antwort

0

Zuerst dachte ich, dies funktionieren könnte:

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

aber nicht wie erwartet funktionieren. Die Regexp funktioniert ordnungsgemäß in kontrollierten Tests, aber nicht in haproxy selbst. Wahrscheinlich ein Problem der Anweisungsverarbeitung und Ausführungsreihenfolge. (? Vielleicht die Änderung der Anforderungspfad Schrauben der erste regexp)

Ich versuchte dann das:

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

Wieder einmal funktioniert es fast, aber aus irgendeinem Grund der Host nicht richtig ersetzt bekommt.

Da dies wurde nur durch das QA env verwendet und das Verhalten unterscheidet sich von Produktion sowieso (statisch *, in meinem Fall, würde zu einem CDN verweisen.), Habe ich beschlossen, das ist eine ausreichende Lösung für jetzt:

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

Ich bin nicht sicher, wie HAProxy funktioniert, aber ich kann dir bei der Regex helfen.

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

wird Ihre neue URL \2.\1/\3 sein.

Beachten Sie, dass Sie möglicherweise die / s in der Regex (die es \/ machen würde) zu entkommen.

Verwandte Themen