HAProxy Карты на основе путей, если хост совпадает - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь загрузить и перенаправить несколько карт путей для каждого домена. В основном проверьте домен, если домен совпадает, используйте эту карту пути домена (не заголовок узла).

# 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

Я что-то здесь упускаю? Похоже, местоположение из пути на карте должно быть возвращено в заголовке местоположения. @Michael - sqlbot вы, кажется, самый знающий в мире HAProxy. Какие-либо предложения? Спасибо.

1 Ответ

1 голос
/ 09 мая 2019

Вы опускаете / в начале вашего пути, поэтому он не совпадает. А именно, изменив текстовую карту на следующую:

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