2

在 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" ] ),那么它会在重定向后保存会话!但为什么会出现这种情况?会话应该是服务器端的。我在“回声”声明之后取消了它!它怎么不会因为我在那之后取消设置变量而回显该值?!

有谁知道发生了什么?

4

4 回答 4

2

处理重定向的方式可能存在问题。您现在通过在标头中指定位置来告诉浏览器重定向异地(即使我们并没有真正离开异地)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 版本中(Version 26.0.1410.64 m在 Windows 和Version 26.0.1410.65Mac OS 上)我没有遇到这个特定问题。无论是否存在unset()命令,本地 URL 与非现场 URL 是否存在。

您可以在Chrome中打开开发人员工具(工具 > 开发人员工具或 Windows 上的 Ctrl-Shift-i 或 Mac 上的 Command-Shift-i)并查看“网络”选项卡下的标题输出。您的域重定向可能会导致 a被丢弃。SESSION

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

这是我的测试机器的SESSION设置(来自phpinfo()): PHP 会话截图

于 2013-04-20T02:59:52.687 回答
0

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

于 2013-04-20T06:34:17.873 回答
0

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

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

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

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

于 2015-12-24T09:40:50.703 回答
-1

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

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

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

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

于 2013-11-27T12:43:35.400 回答