【问题标题】:Accessing PHP session variable from different paths从不同路径访问 PHP 会话变量
【发布时间】:2011-02-10 13:15:49
【问题描述】:

我在 PHP 会话中遇到了一个非常奇怪的问题,以下是事实:

创建会话变量代码 - mydomain/a/b/c/create_session.php

<?
    session_start();
    $_SESSION['test'] = "Hello World";
?>

读取会话变量read mydomain/a/b/c/read_session.php

<?
    session_start();
    echo $_SESSION['test'];
?> 

问题

当我从同一个 URL 中访问 read_session.php 代码时,它可以正常工作。 但是当我尝试从不同的路径读取会话变量时,它不起作用。

示例

mydomain/a/b/c/read_session.php - 有效!

mydomain/a/b/read_session.php - 有效!

mydomain/a/read_session.php - 有效!

mydomain/read_session.php - 不起作用!

mydomain/d/read_session.php - 不起作用!

【问题讨论】:

  • 您在哪个目录中启动会话(=设置 cookie)?我对这个问题的记忆很模糊,但我认为如果您不指定路径,cookie 将仅对该路径和子目录有效
  • 您是否检查过会话 cookie 实际有效的路径? (尝试 Firefox + Web Developer 插件) - 我复制了您在本地主机上描述的内容,没有问题。会话 cookie 对整个域都有效。 (PHP 5.3,默认设置。)
  • 我正在使用 ini_set('session.cookie_path', '/');
  • 嗨 Atli, "/a" 虽然我正在使用 ini_set('session.cookie_path','/') 也许我应该尝试使用第四个参数 setcookie() 到 '/' ..

标签: php session


【解决方案1】:

您可以尝试使用session_set_cookie_params,以防您的配置设置混淆了某处:

session_set_cookie_params(0, '/');
session_start();

您可以将 cookie 配置为仅在域中的某些路径上可用。这可能发生在这里。请注意,如果这是问题,解决它的最佳方法是更改​​ php.ini 中的值:

session.cookie_path = "/"

【讨论】:

  • 我已经添加了这一行 session_set_cookie_params(0, '/');在 session_start() 之前;以您提到的相同方式,但不幸的是它没有帮助。出现同样的问题。
【解决方案2】:

这不是问题。

域需要完全相同(cookie 策略),这意味着 http://www.domainhttp://domain 不同

【讨论】:

  • 在浏览器中查看session id cookie并比较cookie路径。
【解决方案3】:

正如 Briedis 所说,您可能没有使用相同的域。它们是一样的。

确保检查您的session.cookie_paths。您的配置设置可能将 cookie 的路径设置为“/a”。在这种情况下,您描述的功能将会发生,因为路径不匹配。

【讨论】:

    【解决方案4】:

    Cookie(以及会话 ID 的 cookie)可以绑定到某些域和路径。 PHP的session ID cookie的默认配置是将cookie绑定到当前域(session.cookie_domain)和路径/session.cookie_path)。

    也许您的会话配置与默认配置不同,因为 cookie 的路径设置为 /a,因此 cookie 仅在 /a 以及 /a 是正确路径前缀的那些路径中有效(即/a/…)。

    尝试将cookie路径更改为/

    ini_set('session.cookie_path', '/');
    

    【讨论】:

    • 嗯,路径设置为“/”,正如我在 Firefox 的视图 cookie 扩展中看到的那样,但我现在也尝试过,但也没有帮助:(
    • 我可以在 Cookie 信息扩展中看到路径设置为 '/a',即使我在脚本开头使用了 ini_set('session.cookie_path', '/')。
    • @Amir E. Habib:嗯,这很奇怪。改用session_set_cookie_params$old = session_get_cookie_params(); session_set_cookie_params($old['lifetime'], '/');
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多