我使用Apache作为我的应用程序Web服务器的代理,并希望在运行中更改与sessionid cookie关联的域名。这个cookie有一个. company.com域与之关联,我想使用apache mod重写(或一些类似的模块),透明地将域更改为app.company.com。这可能吗?如果可以,如何进行?
bbuxkriu1#
您只能在客户端上更改Cookie的域**,或在服务器上设置Cookie时更改域 * a。一旦设置了Cookie,其路径和域信息就只存在于客户端上。因此,现有Cookie不能在服务器上更改其域,因为这些信息不会从客户端发送到服务器。例如,如果您的本地计算机上有一个类似以下内容的Cookie:
MYCOOKIE:123, domain:www.test.com, path:/
您的服务器将仅接收:
MYCOOKIE:123
为什么不发送路径和域?因为浏览器将这些信息保存在客户端,而不发送,因为它只在***页面位于***www.test.com***和路径***/****时才将此cookie发送到您的服务器。由于是您的服务器,您应该能够更改创建新cookie的代码。如果您觉得出于某种原因需要在代码之外执行此操作,您可以使用类似以下的方法来执行此操作,但您必须查看cookie在标头中的写入方式,以便与之完全匹配。以下是一个未经测试的可行解决方案猜测:使用Apache的mod_headers:
mod_headers
<IfModule mod_headers.c> Header edit Set-Cookie (.*)(domain=.company.com;)(.*) $1 domain=app.company.com; $2 </IfModule>
您也可以使用mod_headers来更改从客户端接收到的cookie,如有必要,如下所示:
<IfModule mod_headers.c> RequestHeader edit Cookie "OLD_COOKIE=([0-9a-zA-Z\-]*);" "NEW_COOKIE_NAME=$1;" </IfModule>
这只会重命名您在请求中收到的Cookie。
hgb9j2n62#
ProxyPassReverseCookieDomain company.com app.company.com
或者交换域(因为您没有明确定义哪个是内部域/外部域)。参考https://httpd.apache.org/docs/2.4/en/mod/mod_proxy.html#ProxyPassReverseCookieDomain
ppcbkaq53#
我不知道有什么模块提供这样的功能,所以我想你需要用mod_ext_filter来编写你自己的output filter。但如果您控制了另一台服务器,则只需省略cookie的 domain 值就足够了,这样客户端将自动选择所请求的域作为cookie的域。
ff29svar4#
我最终只是创建了一个中间页面,通过javascript将cookie域更改为代理服务器(通过省略域值),然后将用户重定向到目标页面。这似乎解决了问题。感谢您的回答。
vc9ivgsu5#
如果您的web应用捕获Host:头并使用它来确定cookie的domain=部分,您还可以考虑Apache指令ProxyPreserveHost On,它从客户端中继Host:头。只有当你的应用被设计为假设其域名是客户端通过Host头建议的任何名称时,这才有效。如果你的应用是其中之一,这不仅会修复你的cookie,还会修复应用生成的任何绝对URL,这可以保存你需要enable mod_substitute的开销
Host:
domain=
ProxyPreserveHost On
ilmyapht6#
ProxyPass "/" "http://company.com/" ProxyPassReverse "/" "http://company.com/" ProxyPassReverseCookieDomain "company.com" "app.company.com"
**注意:**如果它在ProxyPass中排在第二位,它在ProxyPassReverseCookieDomain中应该排在第一位...我花了半天或更长时间才弄明白:-/
另请参阅:https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreversecookiedomain
6条答案
按热度按时间bbuxkriu1#
您只能在客户端上更改Cookie的域**,或在服务器上设置Cookie时更改域 * a。一旦设置了Cookie,其路径和域信息就只存在于客户端上。因此,现有Cookie不能在服务器上更改其域,因为这些信息不会从客户端发送到服务器。
例如,如果您的本地计算机上有一个类似以下内容的Cookie:
您的服务器将仅接收:
为什么不发送路径和域?因为浏览器将这些信息保存在客户端,而不发送,因为它只在***页面位于***www.test.com***和路径***/****时才将此cookie发送到您的服务器。
由于是您的服务器,您应该能够更改创建新cookie的代码。如果您觉得出于某种原因需要在代码之外执行此操作,您可以使用类似以下的方法来执行此操作,但您必须查看cookie在标头中的写入方式,以便与之完全匹配。以下是一个未经测试的可行解决方案猜测:使用Apache的
mod_headers
:您也可以使用
mod_headers
来更改从客户端接收到的cookie,如有必要,如下所示:这只会重命名您在请求中收到的Cookie。
hgb9j2n62#
或者交换域(因为您没有明确定义哪个是内部域/外部域)。
参考https://httpd.apache.org/docs/2.4/en/mod/mod_proxy.html#ProxyPassReverseCookieDomain
ppcbkaq53#
我不知道有什么模块提供这样的功能,所以我想你需要用mod_ext_filter来编写你自己的output filter。
但如果您控制了另一台服务器,则只需省略cookie的 domain 值就足够了,这样客户端将自动选择所请求的域作为cookie的域。
ff29svar4#
我最终只是创建了一个中间页面,通过javascript将cookie域更改为代理服务器(通过省略域值),然后将用户重定向到目标页面。这似乎解决了问题。感谢您的回答。
vc9ivgsu5#
如果您的web应用捕获
Host:
头并使用它来确定cookie的domain=
部分,您还可以考虑Apache指令ProxyPreserveHost On
,它从客户端中继Host:
头。只有当你的应用被设计为假设其域名是客户端通过Host头建议的任何名称时,这才有效。如果你的应用是其中之一,这不仅会修复你的cookie,还会修复应用生成的任何绝对URL,这可以保存你需要enable mod_substitute的开销
ilmyapht6#
**注意:**如果它在ProxyPass中排在第二位,它在ProxyPassReverseCookieDomain中应该排在第一位...我花了半天或更长时间才弄明白:-/
另请参阅:https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreversecookiedomain