我使用apache作为我的应用程序Web服务器的代理,并希望在运行时更改与sessionid cookie关联的域名。
cookie有一个与之关联的.company.com域,我想使用apache mod rewrite(或类似的模块),透明地将域名更改为app.company.com。这可能吗 ?如果是这样,怎么会这样呢?
答案 0 :(得分:4)
您只能在客户端上更改Cookie 的域名,或者在服务器上设置 时。设置cookie后,其路径和域信息仅存在于客户端上。因此,现有的Cookie无法在服务器上更改其域名,因为该信息不会从客户端发送到服务器。
例如,如果您的本地计算机上有一个类似于此的cookie:
MYCOOKIE:123, domain:www.test.com, path:/
您的服务器只会收到:
MYCOOKIE:123
在服务器上。为什么路径和域名没有发送?因为浏览器会在客户端上保留该信息,并且不会发送它,因为它只会将此cookie发送到您的服务器如果该页面位于 www.test.com < / em> ,路径 / 。
由于它是您的服务器,您应该能够更改创建新Cookie的代码。如果您因为某些原因认为您需要在代码之外执行此操作,则可以使用以下内容执行此操作,但您必须准确了解如何在标头中写入Cookie以使其完全匹配。以下是使用Apache 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。
答案 1 :(得分:3)
ProxyPassReverseCookieDomain company.com app.company.com
或交换域(因为您没有明确定义哪个是内部/外部)。
参考:https://httpd.apache.org/docs/2.4/en/mod/mod_proxy.html#ProxyPassReverseCookieDomain
答案 2 :(得分:0)
我不知道任何提供此类功能的模块。所以我想您需要使用output filter编写自己的mod_ext_filter来为您执行此操作。
但是,如果您可以控制其他服务器,则可以省略cookie的域值,以便客户端自动选择所请求的域作为cookie的域。
答案 3 :(得分:0)
我最终只创建了一个中间页面,通过javascript将cookie域更改为代理服务器(通过省略域值),然后将用户重定向到目标页面。这似乎解决了这个问题。谢谢你的回答。
答案 4 :(得分:0)
如果您的网络应用正在捕获Host:
标头并使用它来确定Cookie的domain=
部分,您可能还会考虑Apache指令
ProxyPreserveHost On
它从客户端传递Host:
标头。
这仅适用于您的应用程序旨在假设其域名是客户端使用Host标头建议的内容。如果您的应用是其中之一,这不仅可以修复您的Cookie,还可以修复应用生成的任何绝对网址,这可以节省您需要enable mod_substitute
的开销。