2013-04-20 32 views
2

在Firefox中,会话变量在重定向后保存并可检索,但在Chrome中重定向后,它表示它不存在。为什么会在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" ]); 
} 

为什么不这项工作铬?

编辑:我想我找到了答案,但它没有任何意义。 如果我删除行unset($_SESSION[ "test" ]),那么它会在重定向后保存会话!但为什么会发生?会话应该是服务器端的。我在“回声”声明后解除了它!它如何不回应该值,仅仅是因为我在之后忽略了变量?!

有谁知道发生了什么事?

+0

尝试删除'header'行并让页面死掉。您应该看到一个空白页面,但您可能会看到一条错误消息。如果是这种情况,那么错误是什么意思? – 2013-04-20 00:59:12

+0

@Kolink感谢您的回复。请看我的编辑,因为我发现问题,但它没有任何意义。这是'unset($ _SESSION ['test']''这一行导致它不能被保存!但是我在调​​用echo之后调用它! – 2013-04-20 01:01:59

+0

可能是因为Chrome会记住301,因此从未真正运行设置变量的代码在第一次尝试删除301和清除所有浏览器数据,事后工作吗? – Jon 2013-04-20 01:02:35

回答

0

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

1

这可能是重定向处理方式的问题。您目前正在通过在页眉中指定http://来告诉浏览器重新定向到异地(即使我们并非真的不在现场)。

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

如果用这个代替它,它可以帮助浏览器,以保持SESSION活着,因为它认为它是在同一地点:

header("Location: /"); 

此外,如果你做这样的事情会发生什么:如果

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

echo $test; 
} 

PHP我没有记错将首先执行所有服务器端功能,那么代码返回从打印和回声语句的用户。

如果我是对的,那么这段代码对于两个浏览器都有效,如果它确实是使代码无法工作的未设置命令(因为我们将var保存为可以回显的东西后SESSION被摧毁。

如果它不工作,那么它在浏览器会话中的差异是由于重定向操作更可能。

更新

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

更新4/22

检查头后。在我正在运行的Chrome版本中(Windows上为Version 26.0.1410.64 m,Mac OS上为Version 26.0.1410.65)我没有遇到此特定问题。本地URL与非现场URL是否存在,以及是否存在unset()命令。

您可以在Chrome的打开开发工具(工具>开发者工具或Ctrl-Shift-I键在Windows或Command-Shift-I键在Mac)和看到网络标签下的头输出。您的域名重定向可能会出现某种情况,导致SESSION被删除。

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

这里是我的测试机的SESSION设置(从phpinfo()): PHP Sessions Screenshot

+0

谢谢,但是这并没有解决问题。 :( – 2013-04-20 03:09:29

+0

有没有看到更新? – 2013-04-20 03:09:56

+0

第二个,它说$ test是空的,它没有打印任何东西 – 2013-04-20 03:10:05

-1

我们可以通过双向修复这个问题

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

ii。通过PHP代码在页面上添加“header('Content-Type:text/html; charset = utf-8');”你要张贴

感谢, 苏雷什莱玛克里斯南

0

我不知道,如果你的情况是类似地雷。但对我而言,原因是URL的形成。

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

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

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