Я пытаюсь запустить серверное приложение, которое поддерживает нескольких клиентов.
Каждый из них должен обращаться к приложению со своим собственным 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-адреса не должна появляться в начале (то есть после имени сервера), удалите ^
.