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

обратный прокси с несколькими сеансами в одном браузере

Мой обратный прокси-сервер, похоже, в основном работает, хотя, когда я открываю сеансы на разных внутренних серверах в одном и том же браузере, я получаю это сообщение из браузера (проверено с Chrome и IE):

Already a session is running in this browser, so opening the same session

Как только я открываю вторую сессию, две сессии вмешиваются таким образом, что один из них выходит из системы.

Два URL-адреса запроса:

https://proxy-server/backend1/index.html
https://proxy-server/backend2/index.html

Обратный прокси отображает эти запросы на:

https://backend1:1234/index.html  and
https://backend2:1234/index.html

Я думаю, это связано с куки? Поэтому я сравнил их, и каждый из них имеет уникальное содержимое файлов cookie, например:

Session to backend1:
  QSESSIONID: c1f9468714084ee2fePE6l5x3FqyPl

Session to backend2:
  QSESSIONID: 06b2468a5a0509eb1aWoJRH8TpslxC

Что мне нужно настроить в обратном прокси, чтобы эти сеансы не мешали друг другу?

Спасибо,
Мэтт.

Отвечая на свой вопрос ... Чтобы сразу перейти к ответу, мне нужно было добавить ProxyPassReverseCookiePath к моему <VirtualHost>:

<Location "/backend1">
  ...
  ProxyPass https://backend1:1234/
  ProxyPassReverse https://backend1:1234/
  ...
  ProxyPassReverseCookiePath / /backend1
  ...
</Location>

Чтобы узнать, что мне нужно добавить, потребовалось отследить Set-Cookie заголовок на внутреннем сервере, а также на прокси-сервере.

На бэкэнде я использую lighttpd. Чтобы отследить бэкэнд-запрос / ответ:

server.modules += ("mod_accesslog")
accesslog.use-syslog = "enable"
accesslog.syslog-level = 6
accesslog.format = "%h %l %u %t \"%r\" \"C:%{Cookie}i\" \"S-C:%{Set-Cookie}o\" %>s %b"

Обратный прокси-сервер работает под управлением Apache, поэтому я добавил его в свой <VirtualHost>...

LogFormat "%h %l %u %t \"%r\" \"C:%{Cookie}i\" \"S-C:%{Set-Cookie}o\" %>s %b"
TransferLog "/store/log/httpd_access_log"

Теперь, вооружившись подробностями регистрации, я мог видеть, что происходит ...

После начального экрана входа в систему устанавливается сеанс, и внутренний сервер создает содержимое Cookie и добавляет его в Set-Cookie заголовок. Подсказка, в которой я нуждался, заключалась в том, что он указывает Set-Cookie с участием Path=/. Чтобы сеансы с разных внутренних серверов не мешали друг другу, мне нужно было сделать Path Атрибут зависит от имени внутреннего сервера. Вот что ProxyPassReverseCookiePath делает для меня.

Прокси видит Set-Cookie заголовок и отображает Path атрибут.

Журналы показали на lighttpd (отредактировано для удовольствия):

"POST /api/session HTTP/1.1" "C:i18next=en-us" "S-C:SID=3bmx; path=/; secure"

И после того, как этот ответ проходит через прокси, он модифицируется ProxyPassReverseCookiePath директива быть:

POST /backend1/api/session HTTP/1.1 C:i18next=en-us S-C:SID=3bmx; path=/backend1;secure

Теперь путь Cookie зависит от имени внутреннего сервера.

Мэтт.