Обратный прокси на nginx с перезаписью пути

Иногда возникает необходимость проксировать трафик с домена, к которому пользователи обращаются по корневому пути на другой сервер, где контент отдается по определенному пути (подпапке). Примером такой задачи может случить интерфейс почтового сервера. Пользователь обращается к домену mail.example.com, а веб-интерфейс почтового сервера находится по адресу mail.corp.local:8080/webmail/.

В таком случае необходимо делать не только проксирование, но и перезаписывать путь в ответе бэкенд сервера. Эту задачу решает директива proxy_redirect, которая перезаписывает путь в ответе от бэкенда. Она задает текст, который следует изменить в полях заголовков «Location» и «Refresh» в ответах проксируемого сервера (ответы с кодом 3хх). Можно указать несколько директив proxy_redirect в одной конфигурации, будет использована первая подпадающая под совпадение правил.

Но она не покрывает 100% случае, поэтому может пригодиться директива sub_filter. Она устанавливает строку для замены и строку замены. Строка для замены сопоставляется без учета регистра. Строка для замены и строка замены могут содержать переменные. На одном уровне конфигурации можно указать несколько директив sub_filter. sub_filter_once off включает поиск и замену циклически. Это может быть полезно для перезаписи пути в body ответа.

Обратите внимание, что для модуль ngx_http_sub_module не идет в сборке nginx по умолчанию, его следует включить с помощью параметра конфигурации --with-http_sub_module, если это еще не сделано. Проверить это можно командой nginx -V.

Ну, и наконец, если все указанные опции не покрыли каких-то случаев, то придется делать ручной rewrite адреса. В моем случае, почему-то 302 ответ бэкенда не отрабатывался через proxy_redirect.

Пример рабочей конфигурации reverse proxy для Roundcube может выглядеть так:

location / {
        proxy_pass https://mail.corp.local:8080/webmail/;
        proxy_set_header Host mail.corp.local;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Rewrite redirects from the backend
        proxy_redirect https://mail.corp.local:8080/webmail/ /;

        # Rewrite paths in the response body
        sub_filter '/webmail/' '/';
        sub_filter_once off;

        # Ensure query parameters are passed
        proxy_pass_request_headers on;
        proxy_pass_request_body on;

        # Disable SSL verification if using self-signed certificates
        proxy_ssl_verify off;
    }
    location /webmail {
        rewrite ^/webmail/?$ /$1 permanent;
    }

Был ли наш пост полезен?

Нажмите на звезду, чтобы оценить мои труды!

Средний рейтинг: 0 / 5. Количество голосов: 0

Пока голосов нет. Проголосуй первым!

Мне жаль, что пост вам не помог 🙁

Позвольте мне исправиться.

Поделитесь, что можно улучшить?

Похожие посты