Jak dodać niestandardowy nagłówek zawierający bezwzględny adres pierwotnie żądanego zasobu

11

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 reqaddopcja 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ć Hostnagłówek i pierwszą linię żądania HTTP w niestandardowy nagłówek

Darin Dimitrov
źródło
Czy próbowałeś połączyć reqaddz acl, który odwołuje się do be_id(backend-id)? Nie jest to dokładnie dynamiczne, ale może cię przybliżyć, jeśli liczba backendów jest niewielka ... reqirepobsł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.
Michael - sqlbot

Odpowiedzi:

18

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:

http-request set-header X-Custom-Header %[url]
Nick Craver
źródło
1
Dziękuję za potwierdzenie mojego wniosku, że w 1.4 nie jest to możliwe. Zmieniłem na nginx.
Darin Dimitrov
% [url] nie zawsze jest pełnym adresem URL, ale wydaje się, że jest to najlepszy haproxy. haproxy 1.8 Dokumenty zmiennych URL: cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-url
zie