Как обслуживать два веб-приложения за обратным прокси-сервером nginx

У меня есть два веб-приложения (node.js express apps), web1 и web2. Эти веб-приложения ожидают размещения на сайтах, которые обычно похожи на http://www.web1.com и http://www.web2.com. Я хотел бы разместить их за обратным прокси-сервером nginx как https://www.example.com/web1 и https://www.example.com/web2. Я не хочу показывать два веб-приложения как два поддомена на example.com.

Вот фрагмент моей конфигурации nginx (без сведений о завершении SSL), который, как я надеялся, выполнит это:

server {
  listen 443;
  server_name .example.com;

  location /web1 {
    proxy_pass http://www.web1.com:80;
  }

  location /web2 {
    proxy_pass http://www.web2.com:80;
  }
}

Это работает, за исключением относительных ссылок, которые используют веб-приложения. Таким образом, веб-приложение web1 будет иметь относительную ссылку, например /js/script.js, которая не будет обрабатываться правильно.

Каков наилучший/стандартный способ для этого?

Ответ 2

Вы должны сделать это, проверив $http_referer, что-то вроде:

location / {
  if ($http_referer ~ ^http://(www.)?example.com/web1) {
    proxy_pass http://www.web1.com:80;
  }

  if ($http_referer ~ ^http://(www.)?example.com/web2) {
    proxy_pass http://www.web2.com:80;
  }
}

Браузер будет устанавливать референт на http://example.com/web1/some/page, когда он запрашивает /js/script.js, чтобы приложения не нуждались в изменении, если им не нужно обрабатывать или заботиться о реферере внутри.

$http_referer, похоже, нелегко найти в документах nginx, но упоминается на нескольких сайтах:

Ответ 3

Как использовать cookie и ngx_http_map_module?

Добавьте add_header Set-Cookie "site=web1;Path=/;Domain=.example.com;"; в location /web1 {...} (также web2).

Добавьте map в под http

map $cookie_site $site {
  default http://www.web1.com:80;
  "web2" http://www.web2.com:80;
}

По умолчанию это

location / {
    proxy_pass $site;
}

Вы можете передать значение cookie в proxy_pass напрямую. Но использование карты более безопасным способом.