我的反向代理似乎基本正常工作,但是当我在同一个浏览器中打开与不同后端服务器的会话时,我会从浏览器收到此消息(使用 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-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路径依赖于后端服务器的名称。
马特。