PHP会话ID在页面之间更改

时间:2010-01-11 22:56:39

标签: php session

我遇到一个问题,我在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

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

干杯

威尔

10 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

在将遗留站点从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 :(得分:2)

我刚遇到这个问题。有趣的是,通过http://127.0.0.1而不是http://localhost进行浏览对我有帮助。

答案 3 :(得分:0)

发现问题

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

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

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

我还尝试验证在Web服务器上保存会话的可用性(session.save_path),但是,即使它是一个潜在客户,也不是这样。 我想这是一个&#34;功能&#34;具有MULTIPHP UPDATE的Cpanel会经常发生。

答案 6 :(得分:0)

我遇到了这个问题,原因是PHP在第一个100之后忽略了所有的cookie。(我asked this question to try to find out why,但到目前为止还没有人知道它)。浏览器正在发送PHPSESSID *,但由于它是第110个cookie,PHP忽略了它。

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

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

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

答案 7 :(得分:0)

要解决每个请求后的session_id更改,请将参数 session.auto_start session.cookie_httponly 更改为php配置文件。

找到用过的php配置文件

php -i | grep "php.ini"

然后打开它,并尝试找到参数session.auto_start。你设置

session.auto_start = 1
session.cookie_httponly = 0

最后重启httpd / apache服务。

答案 8 :(得分:0)

发现了问题

在我的情况下,这是由于“清漆设置”引起的,请检查您的清漆设置。 PHPSESSID,您可以从“涂漆设置”中排除cookie。

答案 9 :(得分:0)

我整天都在Ionic3-to-PHP项目中诊断此问题。 TL; DR-确保您的客户端实际上正在发送会话凭据。

为了帮助任何犯此错误的人,我将分享如何发现问题。 我使用这些工具来诊断客户端和服务器上的会话:

1)将带有phpinfo()的测试文件添加到服务器以查看PHP会话选项。

2)检查PHP代码,以确保在session_start()行之前没有发生任何有意或无意的输出。检查Visual Studio代码的状态栏,以确保PHP文件中没有字节顺序标记(BOM)。

3)查看服务器PHP日志(对我来说在/var/log/nginx/error.log中)。在PHP文件中添加error_log()行以转储session_id()或$ _SESSION数组。

4)使用tcpdump -An 'port 80 or port 443'查看实际的HTTP请求和答复。 (这就是我发现缺少cookie的地方。)

对于Ionic3数据提供程序,客户端的正确语法为:

    var obsHttp = this.http.post(url, body,
  { headers: new HttpHeaders({
    'Content-Type':'application/x-www-form-urlencoded'
  }),withCredentials: true }).timeout(this.timeoutTime);

通知withCrentials:true 需要在可观察到的obsHttp()上调用订阅以发送请求。