在同一瀏覽器中具有多個會話的反向代理

在同一瀏覽器中具有多個會話的反向代理

我的反向代理似乎大部分工作正常,但當我在同一瀏覽器中打開到不同後端伺服器的會話時,我從瀏覽器收到此訊息(使用 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

我想這與cookies有關?所以我比較了它們,每個都有獨特的cookie內容,例如:

Session to backend1:
  QSESSIONID: c1f9468714084ee2fePE6l5x3FqyPl

Session to backend2:
  QSESSIONID: 06b2468a5a0509eb1aWoJRH8TpslxC

我需要在反向代理中配置什麼才能防止這些會話相互幹擾?

謝謝,
馬特。

答案1

回答我自己的問題...為了直接回答問題,我需要添加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-CookiePath=/.為了阻止來自不同後端伺服器的會話相互幹擾,我需要使該Path屬性依賴後端伺服器名稱。這就是ProxyPassReverseCookiePath對我的作用。

代理查看Set-Cookie標頭並映射Path屬性。

lighttpd 上的日誌顯示(為觀看樂趣而編輯):

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

而這個響應經過Proxy後,就被指示修改 ProxyPassReverseCookiePath為:

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

現在Cookie 路徑取決於後端伺服器的名稱。

馬特。

相關內容