【问题标题】:PHP Session Id changes between pages页面之间的 PHP 会话 ID 更改
【发布时间】:2023-03-15 08:41:01
【问题描述】:

我遇到了一个问题,我在 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,这对这个域有效,但它阻止了会话被传递到支付域
  • 我们正在运行 apache 2.2.6 和 php 5.2.5

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

干杯

【问题讨论】:

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

标签: php session


【解决方案1】:

根据 PHP 文档,在将任何输出发送回浏览器之前,必须调用 session_start - 此页面是否有恶意 CR/LF、Unicode 字节顺序标记或类似的东西导致在您之前输出 @987654323 @?

【讨论】:

  • 嗨,Ken,我检查了脚本,在 session_start() 调用之前似乎没有任何输出。
【解决方案2】:

在将旧站点从 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 更改

【讨论】:

  • 在每个页面上放置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.
【解决方案3】:

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

【讨论】:

  • 这不是答案,这是避免问题的方法。
【解决方案4】:

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

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

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

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

3) 查看服务器 PHP 日志(我在 /var/log/nginx/error.log 中)。将 error_log() 行添加到 php 文件以转储 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() observable 上调用 subscribe 来发送请求。

【讨论】:

    【解决方案5】:

    发现问题

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

    【讨论】:

      【解决方案6】:

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

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

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

      PHP.ini 文件根本没有那个变量。 进入 Cpanel -> MultiPHP INI Editor -> Editor Mode(不是 Basic,基本没有此设置)并添加该行。按保存。

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

      我还尝试验证在 Web 服务器 (session.save_path) 上保存会话的可用性,但是,即使它是潜在客户,也并非如此。 我想这是带有 MULTIPHP UPDATE 的 Cpanel 的一个“功能”,它会经常发生。

      【讨论】:

        【解决方案7】:

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

        要确定这个问题是否会影响您,请使用浏览器的开发工具查看浏览器随请求发送的 cookie,并将该列表与 PHP 中的 $_COOKIE 数组进行比较。他们应该是一样的。但是如果浏览器发送一个 PHPSESSID*,并且 $_COOKIE 中没有 PHPSESSID*,那么这就可以解释为什么会话不工作了。

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

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

        【讨论】:

          【解决方案8】:

          为了解决每次请求后 session_id 的变化,将参数 session.auto_startsession.cookie_httponly 更改为 php 配置文件。

          查找使用的php配置文件

          php -i | grep "php.ini"
          

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

          session.auto_start = 1
          session.cookie_httponly = 0
          

          最后你重新启动你的 httpd/apache 服务。

          【讨论】:

            【解决方案9】:

            发现问题

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 2011-04-14
                • 1970-01-01
                • 1970-01-01
                • 2019-04-04
                • 1970-01-01
                • 2012-08-01
                • 1970-01-01
                • 1970-01-01
                • 2013-03-05
                相关资源
                最近更新 更多