Як слідкувати за перенаправленнями HTTP всередині nginx?


15

У мене є HTTP-проксі на основі nginx, і я хотів би обробити всі перенаправлення HTTP всередині нього, щоб клієнти отримали лише останню відповідь у ланцюжку переадресації.

Основний код виглядає так:

location /proxy {
    rewrite ^/proxy/([^/]+) $1 break;

    proxy_pass http://$uri/;
}

Моя спроба наступних переадресацій 1 рівня:

error_page 301 302 307 =200 @redir;

... і маючи це назване місцезнаходження:

location @redir {
    proxy_pass $proxy_location;
}

Тільки немає змінної $ proxy_location, і мені не вдалося знайти спосіб її створення. Він повинен містити значення Location:заголовка, отриманого з висхідного потоку.

Будь-які думки?

Відповіді:


7

Я вважаю, що вам потрібна змінна $ upstream_http_location .

Змінні, що починаються з $ proxy *, контролюють те, що йде від nginx до висхідного потоку. Серія змінних $ upstream * містить інформацію про відповідь, яку отримує сам nginx. Ви можете отримати будь-який атрибутивний HTTP-заголовок, отриманий від верхнього сервера з ім'ям $ upstream_http_headername.

Зауважте, що ці змінні $ upstream не можуть бути нічого, крім нульового, поки відповідь не буде отримана від верхнього сервера, тому існують деякі обмеження щодо їх використання.


26

Ось повний приклад того, що працювало для мене:

server {
    ...

    location / {
        proxy_pass http://backend;
        # You may need to uncomment the following line if your redirects are relative, e.g. /foo/bar
        #proxy_redirect / /;
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirect;
    }

    location @handle_redirect {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass $saved_redirect_location;
    }
}

1
Чому вам довелося зберігати значення $ upstream_http_location у новій змінній?
Parth Shah

1
Я не знаю точної причини, але це не працює інакше ...
Влад Фролов

Це чудово, але вибирає лише одне переадресація. Будь-який спосіб обробляти кілька переадресацій?
ThiefMaster

1
@TentistMaster Я вважаю, що ця відповідь - це те, що ви шукаєте.
iBug

Я отримую таку помилку 2020/01/23 09:17:46 [error] 1394#0: *1 invalid URL prefix in "", client: xx.xx.28.3, server: www.example.com, request: "GET /test HTTP/1.1", host: "www.example.com"за допомогою блоку @handle_redirect, будь-яка ідея?
Кирило Духон-Доріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.