【问题标题】:Changing Cookie Domains更改 Cookie 域
【发布时间】:2011-06-22 19:47:14
【问题描述】:

我使用 apache 作为我的应用程序 Web 服务器的代理,并希望即时更改与 sessionid cookie 关联的域名。

cookie 有一个与之关联的 .company.com 域,我想使用 apache mod rewrite(或一些类似的模块),透明地将域更改为 app.company.com。这可能吗 ?如果是这样,你会怎么做?

【问题讨论】:

  • 究竟在什么时候改变它?对于服务器或客户端?我不明白。
  • 在服务器上更改它。基本上,由于 apache 被配置为代理服务器,客户端和应用程序服务器之间的所有流量都通过 apache 服务器进行路由。我想要完成的是在 cookie 到达客户端之前在 apache 代理中更改应用程序设置的 cookie 域。
  • @user 我明白了。我认为这是大型反向代理可以做的事情 - 不知道 Apache 是否有能力。不过,我仍然不确定我理解你为什么需要这个。传出请求不会首先为代理域设置 cookie 吗?
  • app.company.example 是无效的 domain 值。它要么需要是.app.company.example,要么只是省略它以便使用当前域。

标签: apache mod-rewrite dns session-cookies


【解决方案1】:

我不知道有什么模块可以提供这种功能。所以我猜你需要使用 mod_ext_filter 编写你自己的 output filter 来为你做这件事。

但是,如果您可以控制其他服务器,则只需省略 cookie 的 domain 值就足够了,这样客户端就会自动选择请求的域作为 cookie 的域。

【讨论】:

  • 我最终只是创建了一个中间页面,通过 javascript 将 cookie 域更改为代理服务器(通过省略域值),然后将用户重定向到目标页面。这似乎解决了这个问题。感谢您的回答。
【解决方案2】:

我最终只是创建了一个中间页面,通过 javascript 将 cookie 域更改为代理服务器(通过省略域值),然后将用户重定向到目标页面。这似乎解决了这个问题。感谢您的回答。

【讨论】:

    【解决方案3】:

    您只能在客户端或在服务器上设置 cookie 时更改 cookie 的域。设置 cookie 后,它的路径和域信息仅存在于客户端上。因此现有的 cookie 不能在服务器上更改其域,因为该信息不会从客户端发送到服务器。

    例如,如果您在本地计算机上有一个如下所示的 cookie:

    MYCOOKIE:123, domain:www.test.com, path:/
    

    您的服务器只会收到:

    MYCOOKIE:123 
    

    在服务器上。为什么不发送路径和域?因为浏览器将这些信息保存在客户端上,并且不会费心发送它,因为它只会将此 cookie 发送到您的服务器如果页面位于 www.test.com 和路径 /

    由于它是您的服务器,您应该能够更改创建新 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。

    【讨论】:

    • 应该不是 Header edit Set-Cookie (.*)(domain=.company.com;)(.*) $1 domain=app.company.com; $3 因为您在正则表达式中捕获 3 个模式并替换 $2(域)
    • 好点 - 我没有这个设置可以测试,所以也许?但我确实曾经有过这样的工作,并复制了我当时所拥有的东西。所以也许两者都可以?
    • 这对我在 Apache 中根本不起作用。 mod_headers 有效,但无法编辑 Set-Cookie 标头。
    • 您的大部分答案是对对原始问题的误解的回应,而关于“Header edit Set-Cookie”的一个有用的部分似乎不起作用。原始海报很明显在寻找类似 ProxyPassReverseCookieDomain 的东西。 (2011 年可能不存在)
    • @dataless - 我只知道这在 2015 年对我有用......这可能不是最好的方法,但它有效。我看了看,听起来ProxyPassReverseCookieDomain 对我有用!我没有做大量的 Apache 工作,但是在试图弄清楚如何为我们自己的用例执行此操作时将上述内容拼凑在一起,但没有看到 ProxyPassReverseCookieDomain,这听起来很棒。
    【解决方案4】:
    ProxyPassReverseCookieDomain company.com app.company.com
    

    或交换域(因为您没有明确定义哪个是内部/外部)。

    参考:https://httpd.apache.org/docs/2.4/en/mod/mod_proxy.html#ProxyPassReverseCookieDomain

    【讨论】:

      【解决方案5】:

      如果您的网络应用正在捕获 Host: 标头并使用它来确定 cookie 的 domain= 部分,您还可以考虑使用 Apache 指令 ProxyPreserveHost On 它从客户端中继 Host: 标头。

      这仅适用于您的应用程序设计为假定其域名是客户端使用 Host 标头建议的任何名称。如果您的应用是其中之一,这不仅会修复您的 cookie,还会修复应用生成的任何绝对 URL,这可以节省您在其他情况下需要 enable mod_substitute

      的开销

      【讨论】:

        猜你喜欢
        • 2016-08-15
        • 1970-01-01
        • 2018-06-14
        • 1970-01-01
        • 2013-12-04
        • 2019-07-31
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        相关资源
        最近更新 更多