问题 PHP会话ID在页面之间更改


我有一个问题,我在2页之间丢失PHP会话。

session_start()包含在名为session-inc.php的文件中,每个页面都需要设置会话。这适用于站点上的所有页面,除了一个特定页面member-profile.php。访问此页面时,将设置并使用具有不同ID(相同会话名称)的新会话。

更多细节:

  • 会话名称是手动设置的
  • 所有页面都位于同一域名下的同一服务器上
  • 如果我在member-profile.php文件中的include('session-inc.php')上面添加了一个额外的session_start(),则会话被正确地转移
  • 我已尝试在.htaccess中设置session_cookie_domain和session.session_name,这适用于此域,但它已停止将会话传递到付款域
  • 我们用php 5.2.5运行apache 2.2.6

将session_start()放在member-profile.php文件中的include('session-inc.php')之上是对这个问题的快速而肮脏的修复,但我想知道是否有人知道为什么会发生这种情况。

干杯


7587
2018-01-11 22:56


起源

你可以发布你的文件session-inc.php的内容吗?是include('session-inc.php');你在member-profile.php做的第一件事是什么? - Dominik


答案:


根据PHP文档, session_start 必须在将任何输出发送回浏览器之前调用 - 此页面是否有一个流氓CR / LF,Unicode字节顺序标记或类似的导致输出的输出 include('session-inc.php')


7
2018-01-11 23:14



嗨肯我已经检查了脚本,并且在session_start()调用之前似乎没有任何输出。 - willl69
+1字节顺序标记提示+1。你救了我的一天! - AquilaRapax


在将遗留站点从PHP4迁移到PHP5时,我注意到php.ini配置设置导致php在每次请求时自动启动会话。这是放置的替代方案 session_start() 到每一页......

有多种方法可以启用此设置:

将以下行放入php.ini:

session.auto_start = on

或者将其放入您的apache虚拟站点配置或.htaccess文件中:

<IfModule mod_php5.c>
  php_flag session.auto_start on
</IfModule>

它应该在所有页面上进行$ _SESSION更改


2
2018-04-02 15:48



配售 session_start() 在每个页面上都不会在每个请求上创建新会话。根据手册, session_start() creates a session or resumes the current one based on a session identifier passed via a GET or POST request, or passed via a cookie. - ethmz


我刚遇到这个问题。有趣的是,通过浏览 http://127.0.0.1 代替 http://localhost 帮助过我。


2
2017-07-17 20:46





发现了这个问题

在第二个域的主包含文件的开头有一个字节顺序标记。如ken所述,在会话开始之前没有任何输出,它没有正确设置会话。


0
2018-03-04 06:54





发现问题是在文件开头输出了一个字节顺序标记(BOM)。摆脱它,它解决了会话问题。


0
2017-09-22 03:57





解: session.auto_start = on 在文件中:php.ini

它解决了在页面重新加载(页面刷新/更改页面)上重新生成会话ID的问题。

这个问题出现在更新CPanel(包括Multi PHP)之后,即使php版本保持不变。

PHP.ini文件根本没有该变量。 进入Cpanel - > MultiPHP INI编辑器 - >编辑模式(非基本,基本没有这个设置)并添加了该行。按保存。

提示/何时使用此解决方案: 要确定这是否是问题,请在index.php文件的最开头和最后添加一行以检查会话ID。使用功能: SESSION_ID(); 浏览页面/重新加载页面。如果session_id值发生更改,则问题不在您的代码中,此解决方案应解决您的问题(会话在代码之外丢失)。

我还尝试验证在Web服务器上保存会话的可用性(session.save_path),但是,即使它是一个主角,也不是这样。 我想这是Cpanel的一个“功能”,它会经常发生MULTIPHP UPDATE。


0
2017-08-24 09:12





我有这个问题,原因是PHP在第一个100之后忽略了所有的cookie 问这个问题试图找出原因,但到目前为止还没有人知道它。浏览器正在发送PHPSESSID *,但由于它是第110个cookie,PHP忽略了它。

要弄清楚这个问题是否会对您产生影响,请使用浏览器的开发工具查看浏览器随请求发送的cookie,并将该列表与PHP中的$ _COOKIE数组进行比较。它们应该是一样的。但是,如果浏览器正在发送PHPSESSID *,并且$ _COOKIE中没有PHPSESSID *,则可以解释为什么会话无法正常工作。

我没有让我的网站使用如此多的cookie解决了这个问题,这无论如何都是很好的做法。

* PHPSESSID是默认会话名称。您的网站可能使用其他名称。


0
2018-04-19 13:38