IE 和 Firefox 既不读取也不删除 php 会话变量

IE and Firefox neither read nor delete php session variables

首先对可能出现的重复表示抱歉。我注意到有很多关于同一个案例的问题,而且我已经阅读了大量不同的答案。似乎会话变量不起作用可能有多种原因,但没有给出的答案对我有用。这就是为什么我打开另一个问题并希望你能帮助我。

我在我的 apache2 网络服务器(位于名为 'asc-OpenLDAP' 的 openSuse 13.2 虚拟服务器上)上创建了以下两个 php 文件

第一个文件创建会话变量。

test1.php:

<?php
  session_start();
  $_SESSION['test'] = 'test';
  header('Location: test2.php');
  exit();
?>

第二个文件应该读取会话变量并创建输出。

test2.php:

<?php
  session_start();
  echo("Test: " . $_SESSION['test']);
  session_unset();
  session_destroy();
  exit();
?>

到目前为止,我已经用一些浏览器测试了程序。 Vivaldi 1.8 在 test2.php 中正确显示会话变量的内容,而 Internet Explorer 11 和 Firefox 51 不会。

当然,所有三种浏览器都激活了 cookie。

我还在 session.save_path 处检查了会话变量文件。所有浏览器都会在服务器上生成一个会话文件。此文件的内容始终为 test|s:4:"test";。但话又说回来,只有 Vivaldi 能够删除 test2.php.

中的文件

由于我的程序将成为最终用户工具,因此我需要使其尽可能兼容并保存。 请帮助我。

从评论对话中我们可以推断出问题是为 session cookie 指定的路径不正确。

与 cookie 关联的路径指定 cookie 对域的哪些部分有效。例如,如果你只希望一个 cookie 对 www.example.com/foo/bar/ 有效,那么 cookie 的路径应该是 /foo/bar/ 这意味着浏览器将只包含 session cookie 中的 Cookie header 如果您访问的 URL 是 www.example.com/foo/bar/ 或其子路径(例如 www.example.com/foo/bar/baz/quux.php)。如果您访问 www.example.com/foo/ 那么 cookie 将不会在 Cookie header 中发送回服务器。

如果您希望站点的不同部分具有不同的 session(例如,如果您希望 e-commerce 站点可能希望保留不同的 session 数据,这将很有用'在管理部分而不是在购物车中)但在这种情况下,路径被错误地设置为既不包含 test1.php 也不包含 test2.php 的路径。

您可以通过设置 session.cookie_path 的值在 php.ini 中指定它来设置通用路径(默认情况下它应该是 / 但由于某些原因它不在您的安装中).

您也可以使用 session_set_cookie_params() 在 per-script 的基础上进行设置。

至于为什么它在 Vivaldi 中起作用,最可能的解释是 vivaldi 中有一个错误导致 cookie 上的路径参数被忽略。您可能想就此提交错误报告。 FireFox/IE/Chrome 等中的行为都是正确的行为。