Mam następującą konfigurację:
|-------|--- backend1:8080
example.com:80---|HAProxy|--- backend2:8080
|-------|--- backend3:8080
Chciałbym skonfigurować HAProxy, aby dodać niestandardowy nagłówek zawierający oryginalny adres URL. Na przykład, jeśli użytkownik zażąda http://example.com/foo?bar=baz
, tj .:
GET /foo?bar=baz HTTP/1.1
Host: example.com:80
Chciałbym, aby HAProxy przetłumaczył tę prośbę na backend w następujący sposób:
GET /foo?bar=baz HTTP/1.1
Host: backend1:8080
x-custom-header: http://example.com/foo?bar=baz
Ta reqadd
opcja pozwala mi tylko dodać nagłówek o wartości statycznej. Udało mi się pobrać część ścieżki z żądania za pomocą reqrep
:
reqrep ^([^\ ]*)\ ([^\ ]*)\ (HTTP\/1\.[10]) \0\r\nx-custom-header:\ \2
ale niestety przechwytuje to tylko część ścieżki oryginalnego adresu URL, co powoduje następujący nagłówek:
x-custom-header: /foo?bar=baz
Moje pytanie brzmi więc, czy w HAProxy 1.4 można połączyć Host
nagłówek i pierwszą linię żądania HTTP w niestandardowy nagłówek
reqadd
z acl, który odwołuje się dobe_id
(backend-id)? Nie jest to dokładnie dynamiczne, ale może cię przybliżyć, jeśli liczba backendów jest niewielka ...reqirep
obsługuje również opcjonalny acl, więc możesz napisać osobne wyrażenia regularne dla każdego backendu, każdy aktywny tylko, jeśli acl pasuje do wybranego backendu ID.Odpowiedzi:
Krótka odpowiedź: nie, nie możesz tego zrobić w HAProxy 1.4 .
Jednak dla osób, które znajdą to pytanie w wersji 1.5+:
W HAProxy 1.5+ możesz odwoływać się do zmiennych za pomocą
%[variable]
składni i nie jesteś ograniczony tylko do używania ciągów statycznych. Możesz zobaczyć, które zmienne istnieją już w sekcji 7.3 przewodnika konfiguracji HAProxy (szczególnie 7.3.6 dla zmiennych warstwy 7 ).W twoim przypadku patrzysz na surowe
url
, takie jak to:źródło
nginx
.