PHP 会话未设置

Posted

技术标签:

【中文标题】PHP 会话未设置【英文标题】:PHP sessions getting unset 【发布时间】:2013-05-13 12:55:00 【问题描述】:

我正在使用会话变量来存储登录数据。在本地,一切都很顺利,它可以很好地登录并且不会在页面之间注销。

但是当我将相同的文件放在服务器上时,由于某种原因我被注销了。我已经找到this 的帖子,并尝试使用以下代码来防止动态页面的缓存:

header("Cache-Control: no-cache, must-revalidate"); 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

虽然这似乎不起作用。这个问题还有其他可能的解决方案吗?

编辑:请注意,session_start() 在每一页上。

编辑 2: 我做了一些进一步的调查,当我在 mysite.com 上时,我的一些链接似乎链接到 www.mysite.com。转到这个新页面会导致 $_SESSION[] 变量未设置,当使用后退按钮返回上一页时,您可以看到 $_SESSION[] 仍然设置。

【问题讨论】:

您是否在所有页面上都开始了会话 找到问题的根源:在页面中移动时调查请求/响应标头。如果会话正在消失,那么您会在那里看到它。 @ManishJangir:是的,每个页面都开始会话。 @SverriM.Olsen:我该怎么做? @arbitter:查看开发者工具的 Network 标签,它应该在那里。 【参考方案1】:

会话使用 cookie,因此当您更改域(www.site.com 到 site.com)时,这些 cookie 不会被传输。

将您的网络服务器设置为拥有一个规范网址,并将所有人重定向到该网址(例如,在 site.com 上标准化,将 www.site.com 重定向到 site.com)。

这就是我在 apache 中处理重定向的方式:

ServerAlias www.site.com my.site.com site.net www.site.net sites.com www.sites.com site.com
RewriteEngine On
RewriteCond %SERVER_NAME !=site.com
RewriteRule ^(.*) https://site.com/$1 [R=301]

我更喜欢 site.com 而不是 www.site.com,除非你对他们两个做不同的事情,让人们输入额外的四个字符似乎毫无价值。我对 SEO 的(蹩脚)理解是,你最好选择一个,而不是在两个 url(site.com/stuff 和 www.site.com/stuff)上有重复的内容

【讨论】:

拥有 www.mysite.com 比 mysite.com 有什么优势吗?实现这一点的最简单方法是什么?

以上是关于PHP 会话未设置的主要内容,如果未能解决你的问题,请参考以下文章

未设置时的php会话变量问题

PHP 会话未设置

PhP 5.4 中的 PhP 上传进度不起作用。未设置会话变量

PHP 会话数据未保存

php artisan route:list RuntimeException 会话存储未按请求设置

未设置会话变量会停止执行