【问题标题】:How to access cookie values on different paths of the same domain using PHP?如何使用 PHP 访问同一域的不同路径上的 cookie 值?
【发布时间】:2009-12-28 04:29:26
【问题描述】:

$_COOKIE[]可以加路径参数吗?

【问题讨论】:

标签: php cookies


【解决方案1】:

如果您尝试访问为同一域上与当前路径不同的路径设置的 cookie,则无法做到这一点。浏览器本身对此进行了限制,仅发送适合当前路径的 cookie。

【讨论】:

  • facebook 怎么样?,facebook 为域“facebook.com”写入 cookie,但它使用来自“www.facebook.com”的 cookie
  • @user962284 你确定吗?我很确定 FB 在 www.facebook.com 上设置了所有 cookie,因为它甚至无法访问 facebook.com(它们会将您重定向到 www。)
  • 这是不正确的。遵循 RFC 建议的浏览器确实在多个具有相同名称但路径不同的 cookie 的情况下将两个值发送回。实际上是 PHP 阻碍了它。请查看我发布的答案。
【解决方案2】:

虽然 HTTP 客户端(即:浏览器)不会发回设置 cookie 的路径,但 PHP 实际上就其 $_COOKIE 数组对 cookie 做出了假设。

如果您设置两个具有相同名称的 cookie,一个具有路径 / 的值“first-value”,另一个具有路径 /test 的值“second-value” ,遵循 RFC 中推荐的(但不是必需的)行为的浏览器会将这两个值发回给您。当您访问 /test 路径下的 URL 时,浏览器会发送以下内容:

Cookie: name=second-value, name=first-value

“问题”是 PHP 只读取第一个值 - $_COOKIE['name'] 将只包含值“second-value”而没有提示“first-value”存在.如果您需要访问这两个值,则需要自己解析 $_SERVER['HTTP_COOKIE'] 的值 - 这将包含上述的“name=second-value, name=first-value”例子。请注意,“第二值”排在第一位,因为它设置了更长的路径。请注意,RFC 不保证这种行为,它只是说 HTTP 客户端应该这样做。

【讨论】:

  • 有趣,这是特定于子目录的吗?例如,对子目录的请求将收到根的 cookie,但对根的请求不会收到子目录的 cookie?我也很好奇浏览器是否真的实现了这个:)
  • 正确,子目录或更长的路径将始终接收具有匹配的更短路径的cookie。所有浏览器都是以这种方式实现的。唯一不能保证的行为是,如果您有多个名称相同但路径不同的 cookie - 您应该以固定顺序接收两个 cookie,但 RFC 没有做出任何承诺。
  • 这实际上是正确的答案,因为它给出了为什么会发生这种情况的完整解释。我应该注意,这是缺失的,虽然你不能告诉$_COOKIE[] 一个路径,你可以告诉setcookie 一个路径。我们用 API 来面对这个问题。所以你实际上可以告诉setcookie 设置根路径,然后在任何地方访问它,就像这样:setcookie('name', 'data', expire, '/')。最后一个参数是路径并将其设置为/ 使其成为根路径。这将解决 OP 的问题。
  • 建立在 Nate 提到的关于通过 $_SERVER['HTTP_COOKIE'] 可用的 cookie 的内容之上...使用它来将各个 cookie 放入一个数组中:$cookies = parse_ini_string( str_replace( ";" , "\n" , $_SERVER['HTTP_COOKIE'] ) ) ;
【解决方案3】:

是的,这是第 4 个参数,但只有使用当前目录所在的路径设置 cookie,您才能访问该 cookie。

这令人困惑......这是来自 php:

服务器上的路径 cookie 将可用。如果设置为 '/', cookie 将可用 整个域内。如果设置为 '/foo/',cookie 只会是 在 /foo/ 目录中可用 以及所有子目录,例如 /foo/bar/ 的域。默认 value 是当前目录 正在设置 cookie。

http://php.net/manual/en/function.setcookie.php

您可以像访问任何其他 cookie 一样访问它。如果脚本可以访问它,它将在 $_COOKIE 中可用。

【讨论】:

  • 我的意思是如何读取它,如何访问不同路径但在同一个域名上的cookie值?
  • php 不会为您执行此操作。你必须自己实现。
【解决方案4】:

不,这样的参数是不可能的,因为浏览器不会将路径发送到服务器。它只发送每个 cookie 的名称和值(所以你看不到路径,如果它是会话 cookie,什么时候过期等等)。

【讨论】:

    【解决方案5】:

    我认为不可能从其他路径获取 cookie,因为它可能会导致安全问题。

    【讨论】:

      猜你喜欢
      • 2014-06-25
      • 2014-05-28
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2015-03-15
      相关资源
      最近更新 更多