2009-12-28 41 views
7

路径参数可以添加到$ _COOKIE []吗? 。如何使用PHP访问同一个域的不同路径上的cookie值?

+0

您可能会发现['$ cookie-> setPath($ path)'](https://github.com/delight-im/PHP-Cookie/blob/004cde69ec840e65c15275e09b92ecb1da06f357/src/Cookie。php#L104)有帮助,在[这个独立的库](https://github.com/delight-im/PHP-Cookie)中找到。 – caw 2016-09-21 03:09:27

回答

9

如果您尝试访问为当前域设置的同一域上的其他路径设置的Cookie,则无法完成此操作。浏览器本身限制了这一点,只发送适合当前路径的cookies。

+0

Facebook怎么样?,Facebook为域名“facebook.com”写入cookie,但它使用来自“www.facebook.com”的这个cookies – user962284 2012-06-07 23:42:49

+0

@ user962284你确定吗?我很确定FB在www.facebook.com上设置了所有的cookies,因为它甚至无法访问facebook.com(他们将您重定向到www) – 2012-06-08 16:18:28

+0

这是不正确的。遵循RFC *建议的浏览器会在多个cookie具有相同名称但路径不同的情况下将这两个值发回。实际上,PHP是阻碍它的;请看我发布的答案。 – 2014-06-15 02:44:09

2

是的,这是第四个参数,但你只能够访问该cookie,如果它是使用当前目录所在的路径设置

这混乱......这是从PHP:

Cookie将在其上可用的服务器上的路径。如果设置为 '/',则Cookie将在整个域中可用 。如果设置为 '/ foo /',则该cookie将仅在和/或域的所有子目录(如 /foo/bar /)内可用的 。默认 值是 饼干正在被设定的当前目录。

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

你访问它像任何其他的cookie。如果脚本有权访问它,它将在$ _COOKIE中可用。

+0

我的意思是如何读取它,如何访问不同路径中的cookie值,但在相同的域名? – Steven 2009-12-28 05:32:06

+0

如何区分它们? – Steven 2009-12-28 05:32:36

+0

php不会为你做。你将不得不自己实现。 – Galen 2009-12-28 06:21:01

2

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

2

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

4

虽然HTTP客户端(即:浏览器)没有发回cookie设置的路径,但PHP实际上会对其数组的cookie进行假设。

如果设置两个cookie具有相同名称,一个值为“第一价值”与路径/和第二值为“第二值”与路径/测试,浏览器继推荐 - 但不是必需的 - RFC中的行为会将这两个值发回给您。当你/测试路径下访问一个URL,浏览器发送的:

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

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

+0

有趣的是,这是特定于子目录吗?如在中,对子目录的请求将收到根的cookie,但对根的请求不会接收子目录的cookie?另外我很好奇浏览器是否实际执行此操作:) – 2014-06-15 09:08:25

+0

更正,子目录或更长的路径将始终收到一个匹配较短路径的cookie。所有浏览器都以这种方式实现。唯一不能保证的行为是,如果你有多个具有相同名称但路径不同的cookie - 你应该*以一个固定的顺序接收这两个cookie,但RFC不作任何承诺。 – 2014-06-26 18:05:35

+0

这实际上是正确答案,因为它给出了为什么发生这种情况的完整解释。我应该注意到,虽然你不能告诉'$ _COOKIE []'一个路径,但是这个缺失,你可以告诉'setcookie'一个路径。我们正在用API来面对这个问题。所以你可以告诉'setcookie'设置根路径,然后在任何地方访问它,例如:'setcookie('name','data',expire,'/')'。最后一个参数是路径并将其设置为'/'使其成为根路径。这将解决OP的问题。 – jfreak53 2014-10-24 15:48:31

相关问题