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