【问题标题】:Does PHP set by default the session cookie for all subdomains?PHP 是否默认为所有子域设置会话 cookie?
【发布时间】:2013-12-08 16:00:48
【问题描述】:

我想知道应该如何解释 PHP manual 中的这句话:

session.cookie_domain 指定要在会话中设置的域 曲奇饼。默认值为 none,表示服务器的主机名 它根据cookies规范生成cookie。

这是否意味着在 URL www.somedomain.com/somepage.php 上调用session_start 时,cookie 将具有以下形式:

Set-Cookie  PHPSESSID=e48gh5mqggccgmn8172f0j5a06; path=/; domain=.somedomain.com

或者

Set-Cookie  PHPSESSID=e48gh5mqggccgmn8172f0j5a06; path=/; domain=www.somedomain.com

我在索引页面上看到了第一个 cookie 标头,而在其他页面上看到了没有域的标头。

有人可以对此提出一些见解吗?

谢谢

【问题讨论】:

标签: php session


【解决方案1】:

不,php 通常会为当前域例如 wwww.domain.com 设置 cookie。 为了使所有内容保持一致,您必须将所有请求重定向到同一个域,或者为所有子域显式设置 cookie。

编辑:实际上,Firefox 也是如此。我认为PHP实际上不会设置域,因此浏览器可以随意使用他想要的任何东西。我认为 Internet Explorer 会为任何子域设置它

【讨论】:

  • 谢谢。 PHP 实际上不会费心设置域,因此它将发送的 cookie 是:Set-Cookie PHPSESSID=e48gh5mqggccgmn8172f0j5a06; path=/,留给浏览器解释。需要进一步调查以确定哪些浏览器做了什么,但我想这并不重要。
【解决方案2】:

默认情况下没有 PHP 从不为所有子域设置会话 cookie。

如果您想在所有子域中设置 cookie,那么您可以使用以下代码:

<?php
$currentCookieParams = session_get_cookie_params();

$rootDomain = '.example.com';

session_set_cookie_params(
    $currentCookieParams["lifetime"],
    $currentCookieParams["path"],
    $rootDomain,
    $currentCookieParams["secure"],
    $currentCookieParams["httponly"]
);

session_name('mysessionname');
session_start();

setcookie($cookieName, $cookieValue, time() + 3600, '/', $rootDomain);
?>

参考请访问http://www.php.net/manual/en/function.session-set-cookie-params.php

【讨论】:

    【解决方案3】:

    它确实为客户端浏览器中可见的域设置了 cookie(因此,您问题中的选项 2)。如果你想为所有子域设置一个cookie,你应该调用session_set_cookie_params()并将".domain.com"放在$domain参数中。

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 2010-11-25
      • 2013-11-19
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      相关资源
      最近更新 更多