【问题标题】:IE and Firefox neither read nor delete php session variablesIE 和 Firefox 既不读取也不删除 php 会话变量
【发布时间】:2017-07-17 20:39:35
【问题描述】:

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

我在我的 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 中 session 变量的内容,而 Internet Explorer 11 和 Firefox 51 则不会。

当然 cookie 在所有三个浏览器中都被激活。

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

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

【问题讨论】:

  • 没有数据存储在浏览器中,所有数据都存储在服务器端。浏览器上存储的只是一个包含会话 ID 的 cookie。如果某些浏览器无法在会话中显示数据,那么它们可能没有存储会话 ID cookie,这可能是由于您在相关浏览器中设置的任何 cookie 策略。 Firefox 有一个控制台,可以显示服务器发送了哪些 cookie 以及作为请求的一部分发送了哪些 cookie,可能值得检查一下会话 cookie 发生了什么。
  • 是的。这就是我检查它的原因。 ^^ 会话日期与每个浏览器一起存储在服务器上,并且具有正确的内容。 Firefox 控制台说:'Set-Cookie:"PHPSESSID=8c5hskk514dlkmpvn16k1mvn41sifcrmnnaadcoofsr979hlkpt1; path=/var/lib/php5/"' 我认为问题更多在于访问已经存储的数据,因为读取和删除不适用于 IE 和 Firefox。
  • Chrome 56 也无法正常工作。与 Firefox 和 IE 相同的问题。
  • 后续请求是否在请求中发送了相应的 Cookie 头?如果不是,那么它仍然可能是客户端 cookie 问题。如果设置了 cookie,那么它可能是一个竞争条件,您可能会在 test.php 完成刷新会话数据之前被重定向到 test2.php。也许尝试用超链接替换位置重定向只是为了看看会发生什么?
  • 遗憾的是,超链接而不是重定向并没有改变任何东西。但我发现了其他一些事情:在 test1.php 上,会话保存在服务器上。但是在重定向到 test2.php 之后,会话 ID 发生了变化。可能无法匹配收到的会话 id 并创建一个新的。

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


【解决方案1】:

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

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

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

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

您还可以使用session_set_cookie_params() 为每个脚本设置它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多