PHP cookie问题 - 带www或不带www

17

如果我在www.example.com上创建一个cookie,然后在example.com上检查它,为什么该cookie在那里不存在? 我计划使用.htaccess将非www重定向到www域。但是我该如何解决这个问题呢?


你必须显式地设置cookie域。或者使用类似于https://github.com/delight-im/PHP-Cookie这样的工具,它可以自动处理“www”与“非www”的情况。 - caw
4个回答

35
浏览器是罪魁祸首,不是PHP。它们按域存储,不知道www是一个特殊情况; 从它们的角度来看,www.mydomain.commydomain.com是不同的字符串,因此具有不同的安全策略。但是,您可以做一些事情。
设置cookie时,请使用.mydomain.com(带前导点)。这将告诉用户的浏览器将cookie提供给mydomain.com和所有子域,包括www。 PHP的setcookie函数有一个$domain参数,但它是列表中的第五个,因此您可能需要将$expire$path设置为默认值才能访问它。
setcookie('name', 'value', time()+3600, '/', '.mydomain.com');

为了保持一致性,您可能希望考虑将所有网络流量重定向到特定域名,即将mydomain.com的流量发送到www.mydomain.com,或反之亦然。我对SEO(如果不正确请编辑)的模糊了解告诉我,这有助于避免重复内容,并且可以避免所有此类身份验证问题。此外,如果您在子域上存储资产,则在其中保存Cookie会通过每次传输Cookie来减慢流量速度,因此仅在www上存储应用程序Cookie可以获得速度提升。

这里有一个有关如何在Apache中实现此类重定向的教程。


你对SEO的事情很接近了。无论你选择使用www还是不使用,只要你选择一个并坚持使用它就可以了。 - NotMe
www.*并不是一个特殊情况。它只是一种约定,但在http/cookie RFCs中没有明确的含义。浏览器神奇地给予www特殊处理是相当荒谬的。尽管如此,还是要点赞。 - Frank Farmer
是的,这并不是魔法。但在你学习足够多之前,互联网的许多内部工作似乎都像是魔法一样,所以我愿意逐步解释 ;) - Matchu
旧帖子,但感谢确认问题出在浏览器上!在我的情况下,我正在使用JavaScript调用创建/更新Cookie,没有办法强制浏览器忽略“www”而不是非“www”。因此,现在如果访问者以这种方式到达,我将重定向我的页面到非“www”。并且@FrankFarmer,我可以确认,在2019年,浏览器仍然会为每种情况创建不同的Cookie。我同意这似乎很荒谬,但正如我们在“ www”的神秘世界中了解到的那样,作品比看起来有意义更重要,即使同时希望我们终有一天会了解其中的原因。 :-) - Randy

2
setcookie("CookieName", "value", time()+3600, "/", ".mydomain.com");

0

我相信你可以在 example.com(实际上是 .example.com)设置 cookie,如果他们访问 www.example.com,则会发送该 cookie,但反之则不行。这种标准安全策略旨在防止用户的私人数据被发送到意外的服务器。

个人而言,我在我的 apache2.conf 中使用虚拟主机:

<VirtualHost *:80>
    ServerName example.com
    RedirectMatch (.*) http://www.example.com$1
</VirtualHost>

在这个例子中,每个试图加载例如http://example.com/index.html的人都会被重定向到http://www.example.com/index.html

-1

因为 PHP 会将 www.mydomain.com 和 mydomain.com 翻译成不同的内容。如果域名不完全相同,cookie 就无法匹配。

我相信浏览器在允许服务器覆盖 cookie 之前也会寻找域名的完全匹配。

只需使用 .htaccess 进行重定向。这是在所有浏览器中解决此问题的唯一可靠方法。


在域名前加上一个句点可以解决该问题。精确匹配并非必须。 - TheJacobTaylor
1
“因为 PHP 翻译”这个说法是错误的,实际上与 PHP 没有任何关系,而与浏览器有关。浏览器不会将其所有 cookie 发送给网站,它们只会选择那些具有匹配域名的 cookie 发送。 - NotMe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接