在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" ] )
,那么它会在重定向后保存会话!但为什么会这样呢?会话应该是服务器端的。我在“回声”声明之后取消了它!它是如何仅仅因为我在之后取消变量而不回显这个值?!
有谁知道发生了什么事?
答案 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()
):
答案 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