我的反向代理似乎大部分工作正常,但當我在同一瀏覽器中打開到不同後端伺服器的會話時,我從瀏覽器收到此訊息(使用 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-Cookie
了Path=/
.為了阻止來自不同後端伺服器的會話相互幹擾,我需要使該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 路徑取決於後端伺服器的名稱。
馬特。