首次访问时,PHP会话未保存在浏览器中

时间:2016-04-06 15:02:18

标签: php session smarty session-cookies

[代码更新]

我有一个奇怪的会话问题,似乎只有在有人访问该页面时才会出现。

如果您转到以下页面并单击下一步,您可能会发现您被发送到找不到页面的页面。如果您返回链接并再次按下一步,则此时它将起作用。

https://pulse.gd/Xchbeb

奇怪的是,如果您清除了Cookie和所有其他与浏览器相关的历史记录,则问题似乎不再发生。如果您尝试使用其他浏览器,也不会这样做。

我已经看过Chrome上的“资源”标签,可以看到会话最初没有保存,但是第二次尝试。

这是代码的相关部分。所以在脚本的开头:

// set the http headers
header("Content-Type: text/html;charset=utf-8");
header("X-XSS-Protection: 1; mode=block");
header("Strict-Transport-Security: max-age=31536000; includeSubDomains");
header("X-Content-Type-Options: nosniff");
header("X-Permitted-Cross-Domain-Policies: master-only");

session_set_cookie_params ( $lifetime = 0, $path = "/", $domain= "pulse.gd", $secure = TRUE, $httponly = true );

// set-up the session handler
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
register_shutdown_function("sess_shutdown");

然后在被调用函数的顶部:

session_start();

然后当它构建了要传递给下一步的数组时

// store the step array in the session object
$_SESSION['stepArray'] = serialize($stepArray);

此时它(应该)显示下一页。这由Smarty处理。

有人有任何建议吗?

由于

1 个答案:

答案 0 :(得分:0)

重写代码:

我很确定你不需要这些标题的一半,并且大多数会话设置都是无效的语法。

// set the http headers
header("Content-Type: text/html;charset=utf-8");
//header("X-XSS-Protection: 1; mode=block");
//header("Strict-Transport-Security: max-age=31536000; includeSubDomains");
header("X-Content-Type-Options: nosniff");
//header("X-Permitted-Cross-Domain-Policies: master-only");

session_set_cookie_params( 0, "/", "pulse.gd", TRUE, true );

/*** What is the intended purpose of these below functions? **/
// I'm pretty sure you don't need to set these. 
// UNLESS they've been set in place by Smarty, in which case leave them.
// set-up the session handler
// session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
// register_shutdown_function("sess_shutdown");

错误可能出现在您的sess_open函数中,我真的怀疑您确实需要它。