【问题标题】:Session variables are not persisting between page loads会话变量在页面加载之间不持久
【发布时间】:2011-06-01 11:48:28
【问题描述】:

谁能告诉我为什么会话变量没有在页面之间传递?他们工作到 2 天前。现在不是吗?有一个第三方系统,基于第三方系统登录用户。我将用户引导到带有返回 url 的登录页面。第三方系统将用户登录并传递他们的 id 和最终生成的令牌,并将其返回到我的站点,并在 url 中使用 id 和令牌。

如果未设置会话,我尝试从 url 中获取 id 和令牌并设置会话。 (工作)然后我生成自己的令牌以验证从第三方系统传递的令牌(工作)当我点击另一个页面时我设置的会话不为空(????)

这是我的代码:

    <?php
    session_start();

    // FUNCTION TO PASS THE URL THE USER IS ON SO THEY COME 
    // BACk TO THIS PAGE AFTER THE LOG IN. IF APPLICABLE
    function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    } else {
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    return $pageURL;
    }

    // DESTROY SESSION INFO IF TIMED OUT
    if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    session_destroy();   // destroy session data in storage
    session_unset();     // unset $_SESSION variable for the runtime
    }

    // SET THE SESSIONS WITH INFO PASSED FROM
    // LOGIN PAGE SENT AS A GET
    if(isset($_SESSION['ID']) && isset($_SESSION['token'])) {}else{
    $_SESSION['ID'] = $_GET['ID'];
    $_SESSION['token'] = $_GET['token'];
    }

    // GENERATE MY TOKEN TO MATCH THE LOGIN SYSTEM TOKEN
    $userIP = $_SERVER['REMOTE_ADDR'];
    $secretkey = 'A Unique Key For The Logged In User Matching the Login System Passed From mydomain.com/login.php';
    $algorithm = 'md5';
    $mm = date('m');
    $dd = date('d');
    $mmdd = $mm.$dd;
    $mytoken = strtoupper(hash($algorithm, $secretkey.$_SESSION['ID'].$userIP.$mmdd));


    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
    // THIS IS WHERE THINGS ARE GOING WRONG
// SESSION token IS NO LONG SET AFTER I Go To another page
// and my token isnt the same any more either because session ID
// is no longer set???
    if($_SESSION['token']==$mytoken){}else{
    header("location: https://mydomain.com/login.php?returnURL=".curPageURL());
    }
    ?>

好的,这搞砸了。我认为这必须是托管服务提供商 PHP 设置的问题,因为我创建了两个页面。使用此代码调用信息:

<?
session_start();

$_SESSION['ID'] = "112233";
$_SESSION['token'] = "mytoken";

print $_SESSION['ID'];
print $_SESSION['token'];
?>
<a href="info2.php">info 2</a>

还有一个使用以下代码调用 info2:

<?
session_start();

print $_SESSION['ID'];
print $_SESSION['token'];
?>
<a href="info.php">info</a>

信息创建并打印会话正常。当我单击链接转到 info2 时,会话不打印。这是托管配置问题吗?

【问题讨论】:

  • 我遇到了完全相同的问题......除了我的东西在本地主机上,使用 PHP 和 IIS

标签: php session-variables


【解决方案1】:

如前所述,确保您在每个页面上都调用session_start()

另外,脚本是否在不同的子域上?如果是,则应将 INI 值 session.cookie_domain 设置为 .DOMAIN.EXT

要进一步调试整个情况,请做一些简单的 cookie 观察。查看 PHPSESSID 是否在两个页面请求中都作为 cookie 出现,如果不是,那么这就是你的问题。除非您重建它们,否则您不能跨域存储 cookie。


响应您的更新,请尝试在您致电 session_start() 的下方执行此操作:

echo session_id();

确认两个页面上的内容相同。如果没有,请像这样检查session.cookie_domain 的值:

echo ini_get('session.cookie_domain');

这是设置什么吗?默认情况下它应该是空白的,如果它被设置了,尤其是没有设置到你的域,这就是问题所在。

您也可以尝试像我最初建议的那样调试PHPSESSID 的cookie 值。

【讨论】:

  • 查看我对原始帖子的补充
  • 我还没有尝试过,但会的。问题...如果默认 echo ini_get('session.cookie_domain');不是空白,它不是我的域我该怎么办?
  • 2个选项,1:联系您的托管服务提供商,因为它是错误的,2:您可以在session_start()之前使用ini_set('session.cookie_domain', '.your.domain');ini_set('session.cookie_domain', '');
  • As already mentioned, ensure you're calling session_start() on each page.,总是让我难以理解的简单答案。干杯鲁迪,为你点赞!!
  • 我已经检查了所有这些,但仍然无法让 Session 持续存在。我看到 PHPSESSID 已设置,但我的 $_SESSION 变量没有传送到下一页加载。
【解决方案2】:

检查清单
1. 确保你已经使用了 session_start();在下一页。

2.您使用的是.htaccess文件吗?
如果是这样,请删除 .htaccess 文件并进行检查。
有时重写规则会导致会话问题...

3. 如果 session 工作正常,而你只有 token 有问题,那么检查 url 中发送的 token 是否为 url_encoded。

【讨论】:

  • 我已经检查了添加。这个问题可能是因为服务器配置。请咨询您的托管服务提供商。
  • 确实,拥有 .htaccess 文件 导致我的 session_start() 失败并返回 false。哇,这真是微妙而阴险!谢谢它现在可以工作了。
【解决方案3】:

不是托管服务器问题...

检查您的网址

如果用户在“example.com”下登录,会话将存储为“example.com”而不是“WWW.example.com”,因此如果链接转到 www.example.com,则不会有该会话.

您可以使用 htaccess 始终将 url 设置为“WWW.example.com”,使用下面的代码

重写引擎开启

RewriteCond %{HTTP_HOST} ^hemantjadhav.com$ [NC]

重写规则 ^(.*)$ http://www.hemantjadhav.com/$1 [L,R=301]

(将 hemantjadhav 替换为您的域名)

【讨论】:

  • 就是这样,检查你的网址!我把头发拉出来,没有意识到我是从两个不同的站点存储的。一个带 www,一个不带。
【解决方案4】:

答案是主机配置错误。托管公司改变了一些东西,并且从那以后一直有效。

【讨论】:

  • 很高兴知道它是什么。
  • 在我的情况下,它也是托管问题,他们修改了 htaccess 文件并为特定 php 版本添加了一些新规则,似乎 htaccess 在页面和服务器中安装的 php 版本之间造成了冲突
【解决方案5】:

检查会话文件的大小:(代码取自this post

$sessionfile = ini_get('session.save_path') . '/' . 'sess_'.session_id();  
echo 'session file: ', $sessionfile, ' ';  
echo 'size: ', filesize($sessionfile), "\n";

如果您的会话文件大小为零,请确保您的服务器上仍有可用磁盘空间。这就是我遇到的问题。

在 linux 服务器上使用df -h 检查磁盘空间。

【讨论】:

  • 感谢您,我看到我的文件夹没有正确的访问权限。
【解决方案6】:

这个问题的唯一答案是在每一页的顶部使用session_start();。它会正常工作。否则,您可能需要就此问题联系您的托管服务提供商。

【讨论】:

  • 当用九个现有答案回答一个八年前的问题时,解释您的答案所针对的问题的哪些新方面很有用。另请注意,在提出问题时答案是否有效,或者它是否取决于这八年来发生的变化。
【解决方案7】:

在我的情况下,解决方案是在 $_GET 和 $_SESSION 中使用不同的参数名称。

$_SESSION["businessid"] = $_GET["businessid"]; // Leads to problems with session. $_SESSION["business_id"] = $_GET["businessid"]; //Works perfectly.

这听起来很奇怪,但这是我的经验。

【讨论】:

    【解决方案8】:

    我要补充一点,我遇到了同样的问题,除了在我的情况下,页面位于 Varnish 缓存代理之后,我错过了配置中的一行,其中仅允许特定的 cookie路径,否则它们将被以下指令删除:

    unset req.http.cookie;

    别忘了还检查您的代理设置

    【讨论】:

      【解决方案9】:

      我的运行时文件中有session.cookie_samesite = "Strict",并试图将我的用户从 Oauth2.0 反弹回我的站点,并且当重定向命中时 PHP 会话 ID 被删除。我从我的运行时文件中删除了它,现在它可以正常工作了。

      【讨论】:

        【解决方案10】:

        对于其他沮丧地搜索此内容的人 - 另一件要检查的事情是 php.ini 中的 cookie_secure 设置。

        如果cookie_secure=1,cookie 将仅在安全连接上发送并持续存在。在我们的例子中,该站点被部署到一个尚未设置 ssl 的环境中。

        将 cookie_secure 设置回其默认值 (0) - 或确保网站安全。

        【讨论】:

          【解决方案11】:

          确保两个页面在同一个域中。 甚至 www.site.com 也与 site.com 不同

          【讨论】:

            【解决方案12】:

            如果上述解决方案不起作用,我建议您在设置新会话变量之前执行以下操作:

                session_destroy();
                session_start();
            

            然后保存之前没有保留的新会话变量

            【讨论】:

              【解决方案13】:

              你没有打电话给session_write_close()

              【讨论】:

              • 它可能位于脚本的最后。它会写入会话数据并关闭会话,因此只要您完成会话内容就可以了。我只建议结束,因为 session_start() 是你做的第一件事。
              • 试过...没用。当我点击转到另一个页面时,我的会话仍然是空的
              • 他根本不需要这样做。
              • 同意@rudi_visser:php.net/session_write_close - “会话数据通常在脚本终止后存储,无需调用 session_write_close()”。
              • 查看我对原始帖子的补充
              猜你喜欢
              • 2017-01-08
              • 2015-07-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多