Назад | Перейти на главную страницу

Как настроить nginx на использование части URL-адреса в качестве заголовка?

Я пытаюсь запустить серверное приложение, которое поддерживает нескольких клиентов.

Каждый из них должен обращаться к приложению со своим собственным URL-адресом, например http://localhost:8082/customer1/config, но вместо этого приложение должно иметь в качестве заголовка запроса специфичную для клиента часть. Запрос должен быть перенаправлен на http://localhost:9002/config.

Я могу добиться этого, если напишу правило местоположения для каждого клиента:

server {
    listen          8082;
    server_name     localhost;
    root            /;

    location /customer1/ {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_cookie_path ~*^/.* /;
            proxy_set_header X-customer customer1;
            proxy_pass http://127.0.0.1:9002/;
            proxy_redirect off;
    }
}

Как я могу настроить nginx так, чтобы он брал любое имя клиента и помещал его в заголовок?

Это может быть возможно с помощью регулярного выражения, которое имеет группу захвата, в сочетании с mod_headers, которые вам нужно будет скомпилировать в Nginx.

Если правило работает, это может выглядеть примерно так - обратите внимание, что я не приложил никаких усилий, чтобы написать правильное регулярное выражение, вам придется это сделать, и оно полностью не проверено. Это предназначено просто для того, чтобы дать вам концепцию, чтобы вы могли проследить ее и проработать детали или, возможно, исключить ее.

location ~ /(customer?)/config {
  add_header X-customer $1;
  proxy_pass http://localhost:9002/config;
  # proxy_pass related declarations
}

Если это сработает, я предлагаю опубликовать ваше окончательное местоположение, чтобы помочь другим, у кого может быть такая потребность в будущем.

Вот как я сделал эту работу:

location ~ ^/(?!vaadinServlet|customer)(.+?)/(.*) {
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Forwarded-Server $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $host;
       proxy_cookie_path ~*^/.* /;
       proxy_set_header X-customer $1;
       proxy_pass http://127.0.0.1:9002/$2;
       proxy_redirect off;
}

Спасибо Тиму за вдохновение.

Обратите внимание, что это также предотвращает URL-адреса, начинающиеся с vaadinServlet или customer от быть выбранным. Если вам не нужна особая обработка таких ключевых слов, достаточно использовать

location ~ ^/(.+?)/(.*) {
    ...
}

Если обрабатываемая часть URL-адреса не должна появляться в начале (то есть после имени сервера), удалите ^.