Я пытаюсь запустить серверное приложение, поддерживающее нескольких клиентов.
Каждый из них должен обращаться к приложению со своим собственным 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, чтобы он занимал любое имя клиента и помещает его в заголовок?
Вот как я сделал эту работу:
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-адреса не должна появляться в начале (т.е. после имени сервера), удалите ^
.
Это может быть возможно с регулярным выражением, имеющим группу захвата, в сочетании с mod_headers, которые вам придется скомпилировать в Nginx .
Если правило работает, это может выглядеть примерно так - обратите внимание, что я не приложил никаких усилий, чтобы написать правильное регулярное выражение, вам придется это сделать, и оно полностью непроверено. Это предназначено просто для того, чтобы дать вам концепцию, чтобы вы могли проследить ее и проработать детали или, возможно, исключить ее.
location ~ /(customer?)/config {
add_header X-customer $1;
proxy_pass http://localhost:9002/config;
# proxy_pass related declarations
}
Если это сработает, я предлагаю опубликовать ваше окончательное местоположение, чтобы помочь другим, у кого может быть такая потребность. будущее.