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

时间:2017-02-27 09:40:09

标签: php internet-explorer session firefox cross-browser

首先抱歉可能重复。我注意到在那里有很多问题,并且我已经阅读了大量不同的答案。似乎会话变量不起作用可能有几个原因但是给定的答案没有为我做的伎俩。这就是为什么我提出另一个问题并希望你能帮助我。

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

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

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中的文件。

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

1 个答案:

答案 0 :(得分:0)

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

与cookie关联的路径指定cookie对哪些域有效。例如,如果您只希望Cookie对www.example.com/foo/bar/有效,那么Cookie的路径应为/foo/bar/这意味着如果您要访问的网址,浏览器只会在Cookie标头中包含会话Cookie是www.example.com/foo/bar/或其子路径(例如www.example.com/foo/bar/baz/quux.php)。如果您访问www.example.com/foo/,则Cookie不会在Cookie标头中发送回服务器。

如果您希望网站的不同部分具有不同的会话,这很有用(例如,如果您在管理部分,电子商务网站可能希望保留不同的会话数据,而不是您在但是在这种情况下,路径被错误地设置为不包含test1.php或test2.php的路径。

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

您还可以使用session_set_cookie_params()在每个脚本的基础上进行设置。

至于它为何在Vivaldi工作,最可能的解释是vivaldi中存在一个错误导致cookie上的path参数被忽略。您可能想要提交有关此问题的错误报告。 FireFox / IE / Chrome等中的行为是正确的行为。