为什么仅在Chrome中重定向后才会保存会话变量?

时间:2013-04-20 00:51:48

标签: php google-chrome session redirect

在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 个答案:

答案 0 :(得分: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版本中(Windows上为Version 26.0.1410.64 m,Mac OS上为Version 26.0.1410.65)我没有遇到此特定问题。是否存在本地URL与非现场URL,无论是否存在unset()命令。

您可以在 Chrome (工具&gt;开发者工具或Windows上的Ctrl-Shift-i或Mac上的Command-Shift-i)中打开开发人员工具,然后查看网络标签下的标头输出。您的域名重定向可能会导致SESSION被删除。

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

以下是我的测试计算机的SESSION设置(来自phpinfo()): PHP Sessions Screenshot

答案 1 :(得分:0)

问题是由于Chrome对同一页面的多次请求造成的。没有其他浏览器以同样的方式执行此操作,因此该问题仅针对Google Chrome显示。

答案 2 :(得分:0)

我不确定你的案子是否与我的相似。但对我来说,原因是URL的形成。

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

并使用“http://domainname.com”重定向而不使用 WWW。不会重复使用sessionid。

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

答案 3 :(得分:-1)

我们可以通过双向解决这个问题

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

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

谢谢, Suresh Ramakrishnan