【问题标题】:Why is session variable not being saved after redirect in Chrome only?为什么仅在 Chrome 中重定向后没有保存会话变量?
【发布时间】:2013-04-13 11:36:34
【问题描述】:

在 Firefox 中,会话变量在重定向后被保存并可检索,但在 Chrome 中,重定向后,它说它不存在。

重定向代码:

session_start();
$_SESSION[ "test" ] = "exists";
session_write_close();
header( "HTTP/1.1 301 Moved Permanently" ); //Removing this 301 line doesn't help
header( "Location: http://" . $_SERVER[ "HTTP_HOST" ] . "/" );
exit();

检索会话:

session_start();
if ( isset( $_SESSION[ "test" ] ) )
{
    echo $_SESSION[ "test" ];
    unset( $_SESSION[ "test" ] );
}

为什么这在 chrome 中不起作用?

编辑:我想我找到了答案,但它没有意义。 如果我删除unset( $_SESSION[ "test" ] ) 行,那么它会在重定向后保存会话!但为什么会出现这种情况?会话应该是服务器端的。我在“回声”声明之后取消了它!仅仅因为我在 after 之后取消设置变量,它怎么不会回显该值?!

有人知道怎么回事吗?

【问题讨论】:

  • 尝试删除header 行,然后让页面消失。您应该会看到一个空白页面,但您可能会看到一条错误消息。如果是这种情况,错误说明了什么?
  • @Kolink 感谢您的回复。当我发现问题时,请查看我的编辑,但这没有意义。导致它无法保存的是 unset( $_SESSION[ "test" ] 行!但是我在调​​用 echo 之后调用它!
  • 可能是 Chrome 记住了 301,因此在第一次之后从未真正运行设置变量的代码。尝试删除301并清除所有浏览器数据,之后是否有效?
  • @Jon 刚刚尝试过,但没有解决。 301不是问题。出于某种原因,“未设置”是问题所在。但我不知道为什么。
  • @DonRhummy:如果没有实际的可运行代码,很难调试它,但我重复一遍:unset 不是问题,select isn't broken

标签: php google-chrome session redirect


【解决方案1】:

我不确定您的情况是否与我的情况相似。但对我来说,原因是 URL 的形成。

对于 chrome,当将 URL 键入为“http://www.domainname.com”并在那里设置会话变量时。

并在没有 WWW 的情况下使用“http://domainname.com”重定向。 sessionid 不会被重用。

这解决了我的问题希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    我们可以通过两种方式解决此问题

    我。在 Firefox 浏览器设置中将字符编码更改为“UTF-8”

    二。通过 PHP 代码在页面添加“header('Content-Type: text/html; charset=utf-8');”你要发布的内容

    谢谢, 苏雷什·拉马克里希南

    【讨论】:

      【解决方案3】:

      处理重定向的方式可能存在问题。您现在通过在位置标头中指定http:// 来告诉浏览器重定向到异地(即使我们并没有真正去异地)。

      header( "Location: http://" . $_SERVER[ "HTTP_HOST" ] . "/" );
      

      如果你用它替换它,它可能有助于浏览器保持SESSION 活着,因为它认为它在同一个站点上:

      header("Location: /");
      

      另外,如果你这样做会发生什么:

      if (!empty( $_SESSION[ "test" ] ) ){
      $test = $_SESSION[ "test" ];
      unset( $_SESSION[ "test" ] );
      
      echo $test;
      }
      

      如果我没记错的话,PHP 会先执行所有服务器端函数,然后从 print 和 echo 语句中将代码返回给用户。

      如果我是对的,那么如果确实是 unset 命令导致代码无法工作,那么这段代码将适用于两个浏览器(因为我们将 var 保存到可以在之后回显的内容SESSION 被销毁了。

      如果它不起作用,那么很可能是由于重定向导致浏览器会话处理的不同。

      更新

      另请注意,可以缓存 301 重定向。您正在一个已经告诉您的浏览器永久移动的页面上执行这些功能。如果在后续尝试中依赖缓存,它甚至可能根本看不到设置 SESSION 的页面。

      4/22 更新

      检查标题后。在我正在运行的 Chrome 版本中(Windows 上的Version 26.0.1410.64 m 和 Mac OS 上的Version 26.0.1410.65)我没有遇到这个特殊问题。无论unset() 命令是否存在,是否存在本地 URL 与非站点 URL。

      您可以在 Chrome 中打开 开发者工具(工具 > 开发者工具或 Windows 上的 Ctrl-Shift-i 或 Mac 上的 Command-Shift-i)并查看标题Network 标签下的输出。您的域重定向可能发生了一些问题,导致SESSION 被丢弃。

      它可能特定于您本地计算机上的设置或您为特定操作系统构建的 Chrome(如果它与我自己的不同)。此外,它可能是 PHP 中的配置设置以及您实际传递 SESSIONs 的方式。我只是将您的代码直接从问题粘贴到一个新页面中,并创建了一个页面以将其重定向到。经过测试,我机器上的所有浏览器(Chrome、Firefox、IE (7,8,9)、Opera、Safari 和 Mozilla)都说“存在”。

      这是我的测试机的SESSION 设置(来自phpinfo()):

      【讨论】:

      • 谢谢,但这并不能解决问题。 :(
      • 第二个,它说 $test 是空的。它不打印任何东西。
      • 让我深入研究标题。我会加载它并检查它们。
      • 谢谢!如果您需要更多信息,请告诉我。我发现了一件事:如果我在页面上创建和设置会话变量,将其存储在本地/全局变量中,然后取消设置会话变量,它就可以正常工作。但是,如果在页面上设置了会话变量,然后重定向到新页面,并且在新页面上我们存储它然后取消设置会话变量,那么 that 不起作用。
      【解决方案4】:

      问题是由于 Chrome 对同一页面的多次请求。没有其他浏览器以相同的方式执行此操作,因此该问题仅出现在 Google Chrome 上。

      【讨论】:

      • 现在,我也面临这个问题。从另一个页面付款后,最终用户失去了登录会话。请问你是怎么处理这个问题的?如果最终用户在付款后退出,这会让他们非常困惑。
      • @TommyDo 我不记得了,因为它已经 7 年了,但它与 chrome 预取页面有关。我想我必须做点什么来检测这一点
      猜你喜欢
      • 2012-11-17
      • 2018-11-17
      • 1970-01-01
      • 2012-08-13
      • 2017-03-31
      • 2020-10-25
      • 2014-03-18
      • 2021-11-29
      • 2023-03-29
      相关资源
      最近更新 更多