【问题标题】:PHP cookie problem - www or without wwwPHP cookie 问题 - www 或没有 www
【发布时间】:2011-01-21 15:43:27
【问题描述】:

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

【问题讨论】:

标签: php .htaccess cookies


【解决方案1】:

浏览器是这里的罪魁祸首,而不是 PHP。他们按域存储,不知道www 是一个特例;从他们的角度来看,www.mydomain.commydomain.com 是不同的字符串,因此具有不同的安全策略。但是,您可以做一些事情。

设置 cookie 时,使用.mydomain.com(带前导点)。这将告诉您的用户浏览器使mydomain.com 和所有子域(包括www)可以访问cookie。 PHP 的 setcookie 有参数 $domain,但它在列表中排名第五,因此您可能需要将 $expire$path 设置为它们的默认值才能获得它。

setcookie('name', 'value', time()+3600, '/', '.mydomain.com');

但是,为了保持一致性,您可能希望考虑将所有网络流量重新路由到特定域,即将mydomain.com 流量发送到www.mydomain.com,反之亦然。我对 SEO 的模糊知识(如果不正确,请编辑)告诉我,它有助于避免重复内容,并且可以为您节省所有此类身份验证问题。此外,如果您将资产存储在子域中,则在其中放置 cookie 会降低流量,因为每次都必须传输它,因此仅在 www 上存储应用程序 cookie 可以提高速度。

Here is a tutorial on how to accomplish such a redirect in Apache.

【讨论】:

  • 你已经接近 SEO 了。无论您选择使用或不使用 www 都没有关系;只要你选择一个并坚持下去。
  • www.* 不是特例。这是一个约定,但它在 http/cookie RFC 中没有明确的含义。浏览器神奇地给予 www 特殊待遇是相当荒谬的。无论如何,+1。
  • 是的,不是。但是在你学得够多之前,互联网的很多内部运作看起来就像魔法一样,所以我愿意在解释的时候逐步进行;)
  • 旧帖子,但感谢您确认浏览器的问题!就我而言,我正在使用 javascript 调用创建/更新 cookie,在这种情况下,无法强制浏览器忽略“www”而不是非 www。所以现在如果访问者以这种方式到达,我会将我的页面重定向到非 www。 @FrankFarmer,我可以确认,截至 2019 年,浏览器仍会为这两种情况创建不同的 cookie。我同意这看起来很荒谬,但正如我们在“www”的神秘世界中了解到的那样,什么 WORKS 比什么使 SENSE 更重要,即使我们希望有一天我们能了解它的原因。 :-)
【解决方案2】:
setcookie("CookieName", "value", time()+3600, "/", ".mydomain.com");

【讨论】:

    【解决方案3】:

    我相信您可以在 example.com(实际上是 .example.com)上设置 cookie,如果他们访问 www.example.com,它将被发送,但反之则不行。这个标准的安全策略是为了防止用户的私人数据被发送到非预期的服务器。

    就我个人而言,我在 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

    【讨论】:

      【解决方案4】:

      因为 php 对 www.mydomain.com 的翻译与 mydomain.com 不同。如果域不是 100% 相同,则 cookie 将不匹配。

      而且我确信浏览器在允许服务器覆盖之前也会寻找 100% 匹配的域名。

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

      【讨论】:

      • 在域前加上句点可以解决问题。不需要完全匹配。
      • “因为 php 翻译”... 它与 php 无关,与浏览器有关。浏览器不会将他们拥有的所有 cookie 发送到网站。他们只选择具有匹配域名的那些。
      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 2019-06-01
      • 2015-02-11
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多