同一浏览器中的多个会话的反向代理

同一浏览器中的多个会话的反向代理

我的反向代理似乎基本正常工作,但是当我在同一个浏览器中打开与不同后端服务器的会话时,我会从浏览器收到此消息(使用 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 有关?所以我比较了它们,每个都有独特的 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"

此响应经过代理后,将被指令修改 ProxyPassReverseCookiePath为:

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

现在Cookie路径依赖于后端服务器的名称。

马特。

相关内容