Как настроить 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, чтобы он занимал любое имя клиента и помещает его в заголовок?

0
задан 25 May 2016 в 12:52
2 ответа

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

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 или клиент из числа выбранных. Если вам не требуется особая обработка таких ключевых слов, достаточно использовать

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

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

1
ответ дан 4 December 2019 в 12:23

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

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

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

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

2
ответ дан 4 December 2019 в 12:23

Теги

Похожие вопросы