HAProxy 1.6+:根据路径重写主机
HAProxy 1.6+: rewrite host based on path
我正在尝试重定向所有请求的类型:
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:
- 新的子域基于原始路径的第一部分,具有相同的 TLD
- 新路径是不包括第一部分的原始路径
我很确定正则表达式可以解决这个问题,只是不确定如何根据另一个修改 header..
我不确定 HAProxy 的工作原理,但我可以帮助您处理正则表达式。
尝试:^static\.([^/]+)/([^/]+)/(.*)$
您的新 URL 将是 ./
。
请注意,您可能需要转义正则表达式中的 /
(这会使它成为 \/
)。
起初我认为这可能有效:
# 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\.([^/]+?)$ Host:\ . 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 ^([^\ :]*)\ /[^/]+/(.*) \ / 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
#---------------
我正在尝试重定向所有请求的类型:
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:
- 新的子域基于原始路径的第一部分,具有相同的 TLD
- 新路径是不包括第一部分的原始路径
我很确定正则表达式可以解决这个问题,只是不确定如何根据另一个修改 header..
我不确定 HAProxy 的工作原理,但我可以帮助您处理正则表达式。
尝试:^static\.([^/]+)/([^/]+)/(.*)$
您的新 URL 将是 ./
。
请注意,您可能需要转义正则表达式中的 /
(这会使它成为 \/
)。
起初我认为这可能有效:
# 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\.([^/]+?)$ Host:\ . 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 ^([^\ :]*)\ /[^/]+/(.*) \ / 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
#---------------