HAProxy Maps 基于路径,如果主机匹配
HAProxy Maps based on paths, if host match
我试图在每个域的基础上加载和重定向多个路径映射。基本上检查域,如果域匹配,则使用此域路径映射(不是主机header)。
# redirect
http-request redirect location %[path,lower,map(/etc/haproxy/maps/foo.textmap)] code 301 if { hdr(host) -i foo.com }
#foo.textmap
path https://bar.com/path
当我像这样卷曲它时。看起来 HAProxy 正在返回 301,但位置似乎丢失了
[centos@ip-10-121-111-57 ~]$ curl -ILvs --resolve foo.com:80:127.0.0.1 http://foo.com/path
* Added foo.com:80:127.0.0.1 to DNS cache
* About to connect() to foo.com port 80 (#0)
* Trying 127.0.0.1...
* Connected to foo.com (127.0.0.1) port 80 (#0)
> HEAD /path HTTP/1.1
> User-Agent: curl/7.29.0
> Host: foo.com
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
HTTP/1.1 301 Moved Permanently
< Content-length: 0
Content-length: 0
< Location:
Location:
<
* Connection #0 to host foo.com left intact
我是不是漏掉了什么?似乎地图中路径的位置应该在位置 header 中返回。 @Michael - sqlbot 你似乎是 HAProxy 世界中知识最渊博的人。有什么建议么?谢谢
您从路径的开头省略了 /
,因此它不匹配。即,将您的文本映射更改为以下内容:
#foo.textmap
/path https://bar.com/path
结果:
> curl -I foo.com/path
HTTP/1.1 301 Moved Permanently
Content-length: 0
Location: https://bar.com/path
对于路径与您地图中的某些内容不匹配的情况,您可能想要做一些事情,而不是在 301 中发送一个空位置。例如,这是一个将重定向到默认值的修改 URL 如果找不到路径:
# redirect
http-request redirect location %[path,lower,map(/etc/haproxy/maps/foo.textmap,https://bar.com/default)] code 301 if { hdr(host) -i foo.com }
否则,如果您只想在匹配时重定向,那么您将编写更复杂的 acl 来匹配域,如果它存在于您的映射中。
http-request redirect location %[path,lower,map(/etc/haproxy/maps/foo.textmap)] code 301 if { hdr(host) -i foo.com } { path,lower,map_str(/etc/haproxy/maps/foo.textmap) -m found }
我试图在每个域的基础上加载和重定向多个路径映射。基本上检查域,如果域匹配,则使用此域路径映射(不是主机header)。
# redirect
http-request redirect location %[path,lower,map(/etc/haproxy/maps/foo.textmap)] code 301 if { hdr(host) -i foo.com }
#foo.textmap
path https://bar.com/path
当我像这样卷曲它时。看起来 HAProxy 正在返回 301,但位置似乎丢失了
[centos@ip-10-121-111-57 ~]$ curl -ILvs --resolve foo.com:80:127.0.0.1 http://foo.com/path
* Added foo.com:80:127.0.0.1 to DNS cache
* About to connect() to foo.com port 80 (#0)
* Trying 127.0.0.1...
* Connected to foo.com (127.0.0.1) port 80 (#0)
> HEAD /path HTTP/1.1
> User-Agent: curl/7.29.0
> Host: foo.com
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
HTTP/1.1 301 Moved Permanently
< Content-length: 0
Content-length: 0
< Location:
Location:
<
* Connection #0 to host foo.com left intact
我是不是漏掉了什么?似乎地图中路径的位置应该在位置 header 中返回。 @Michael - sqlbot 你似乎是 HAProxy 世界中知识最渊博的人。有什么建议么?谢谢
您从路径的开头省略了 /
,因此它不匹配。即,将您的文本映射更改为以下内容:
#foo.textmap
/path https://bar.com/path
结果:
> curl -I foo.com/path
HTTP/1.1 301 Moved Permanently
Content-length: 0
Location: https://bar.com/path
对于路径与您地图中的某些内容不匹配的情况,您可能想要做一些事情,而不是在 301 中发送一个空位置。例如,这是一个将重定向到默认值的修改 URL 如果找不到路径:
# redirect
http-request redirect location %[path,lower,map(/etc/haproxy/maps/foo.textmap,https://bar.com/default)] code 301 if { hdr(host) -i foo.com }
否则,如果您只想在匹配时重定向,那么您将编写更复杂的 acl 来匹配域,如果它存在于您的映射中。
http-request redirect location %[path,lower,map(/etc/haproxy/maps/foo.textmap)] code 301 if { hdr(host) -i foo.com } { path,lower,map_str(/etc/haproxy/maps/foo.textmap) -m found }