【问题标题】:Session info is lost in Chrome (but works in other browsers)会话信息在 Chrome 中丢失(但在其他浏览器中有效)
【发布时间】:2013-10-29 18:05:21
【问题描述】:

这可能是与Session data lost in Chrome only 相同的问题,并且与Randomly Losing Session Variables Only In Google Chrome & URL Rewriting 有关

那里没有适合我的解决方案,我希望有人对此有一些新的意见。

这些是我遵循的步骤:

  1. 我用<?php session_start();?> 初始化一个会话(不是cookie),然后稍后在同一个php 文件中用$_SESSION['nu'] = $userName; 设置变量

  2. 然后我用window.location.href = "foo.php" 重定向到一个新的php。该 php 文件启动会话(第一件事,与上面相同),然后使用 $_SESSION['nu']。到目前为止,在所有浏览器中一切正常。

  3. 在 Chrome(31.0.1650.26 beta)上的第二个 php 页面(步骤 2 中的那个):

    • 我可以在通过 AJAX 调用访问的 php 文件中使用 $_SESSION['nu']。
    • 如果我重新加载页面,$_SESSION['nu'] 将不再设置。第一次加载后,它没有设置。
    • 如果我转到另一个也需要 $_SESSION['nu'] 的页面,它也无法访问它。
  4. 在 Safari(5.1.9 和 5.1.7)和 Firefox(24.0 和 18.0)上,我可以重新加载并转到另一个页面,设置了 $_SESSION['nu'] 并且一切正常。

  5. 当我在我的家庭环境 (MAMP 1.9.6) 上测试它时,它在 Chrome 上也能正常工作。

  6. 在两个 php.ini 文件(家庭和在线)中,session.use_only_cookies 都处于启用状态(本地和主控)。

由于我可以通过 AJAX 访问它(不更改页面),因此 Chrome 在转到新页面时似乎存在会话问题。但是为什么它第一次起作用呢?我确实会换页...

我尝试了 favicon.ico 解决方案(我在 web 根目录中放置了一个名为 favicon.ico 的图标文件),但它没有改变任何东西。

有什么建议吗?谢谢!

更新

  • 所有试图访问 $_SESSION['nu'] 的 php 文件都位于根目录('my' 根目录,因为我使用的是网络酒店)。
    • 查看 Chrome 的控制台,进入“资源 -> Cookies”,我可以看到 cookie 一直存在(当我从启动会话的 php 文件移动到 foo.php 时)。
    • 让我难以置信的是它可以在 FF 和 Safari 中运行...

更新2

来自控制台的图像。这是我在 foo.php(第二页)时看到的:

铬:

Safari:

解决方案(希望如此): 我不确定为什么它现在可以工作,这让我不太舒服,但是,暂时......为了解释发生了什么,我需要提供更多细节:

  • index.php 调用 start_session()。设置变量 $_SESSION['nu'] = Null。然后页面等待登录按钮被点击。

  • 登录按钮有一个脚本,它通过 AJAX 调用 singIn.php,它调用 start_session() 并设置 $_SESSION['nu'] = "bar"。在AJAX调用的done()函数中,脚本调用window.location.href = "foo.php"。

  • foo.php 调用 session_start() 并检索 $_SESSION['nu']。

在我的 try-anything-mode 中,我测试了从 index.php 中删除 start_session()。我还删除了分配 $_SESSION['nu'] = Null。我希望它们到位,以确保访问 index.php 将清除会话并事实上注销用户。但是该网站确实有一个适当的注销选项,所以我可以坚持下去。

没有 index.php 中的这些行,它似乎可以在 Chrome 中工作。也就是说,当用户浏览站点中的其他页面或重新加载 foo.php 时,$_SESSION['nu'] 的值不会丢失。

正如我之前所说,这在 FF 和 Safari 中一直有效。现在也在 Chrome 中。如果有人能找到解释,我将不胜感激!

【问题讨论】:

  • 您是否在子文件夹(不是根目录)中编码?如果是这样,您是否清除了 cookie?您可能在初始开发中启动了一个会话(将 cookie 存储在“根”),然后开始在子文件夹中进行开发。根据调用的不同,您可以在根目录中选择旧的(已失效的)会话。清除 cookie 以解决问题。 (是的,PHP 将会话 ID 存储在 cookie 中)。
  • @Robbie - 谢谢,检查清除 cookie,重新启动 Chrome 等等。还是一样的问题。请参阅更新的问题。但我不确定我知道“开发”是什么意思……“发展”?
  • “我可以看到 cookie 一直存在” - 它的 内容 和会话 id 怎么样 - 这会改变吗?跨度>
  • @CBRoe - Safari 和 Chrome 有非常相似的控制台。查看资源-> Cookies 我看到:(Safari:PHPSESSID 和另外两行,大概是我存储在 $_SESSION 中的两个变量,以某种方式加密)(Chrome:只有 PHPSESSID,没有更多行)。当我从 php file1 转到 foo.php 时,会话 ID 不会改变(无论是在 Chrome 中,还是在 Safari 或 FF 中)。查看图片更新。
  • “大概是我存储在 $_SESSION 中的两个变量,以某种方式加密” - 不,会话值存储在服务器上,而不是客户端上。

标签: php google-chrome session


【解决方案1】:

我遇到了类似的问题:在页面呈现后不久,cookie 已被清除(有时,并非总是如此)。原因是在页面渲染期间多次调用内部 API,其中有 session_start();里面。

从 API 中删除 session_start() 解决了问题。

Chrome 和 Firefox 出现问题,Safari 没有问题。

【讨论】:

    【解决方案2】:

    这可能是一个跨域问题。 尝试对附加的 cookie 使用 sameSite 选项配置:

       var cookieOptions = new CookieOptions
                {
                    HttpOnly = true,
                    Secure = true,
                    Expires = DateTime.UtcNow.AddDays(7),
                    SameSite = SameSiteMode.None
                };
                Response.Cookies.Append("refreshToken", token, cookieOptions);
    

    【讨论】:

      猜你喜欢
      • 2019-07-09
      • 2012-02-27
      • 2018-11-30
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多