好的,我遇到了最棘手的问题。 (警告:前面的文字墙)
我跟踪$_SESSION
中的变量,根据用户通过AJAX点击的标签设置不同的数字。为方便起见,我还在目标网站上设置了该变量以确保其设置(对于没有启用JS或类似问题的人)。
每个浏览器都运行正常。现在我正在使用IE进行测试,只要您点击目标网站上另一个值为2
的标签的链接,该值就会自行重置为0
。每个其他标签(可能的值为0
,1
,2
当然,3
和4
,因为有五个标签)可以正常工作。
如果我注释掉目标站点中的便利分配(每个目标站点都有btw),则2
突然显示。虽然调试显示目标网站将值设置为int(2)
到int(2)
...因此没有发生真正的更改(但仍然,删除此不变更改会修复它)。
现在的问题是:
& @#$是什么让Internet Explorer搞砸了一个完美的PHP会话?
我已经多次检查了我的整个项目并调试了它的大部分内容,以找出导致此问题的原因但却一无所获。设置值只有三行。
会话对象是第一次创建并获得值0
。
我已经检查了这个,它实际上只在会话创建时调用。 (我已经用一个回声包围了这条线,如果它被调用了,它应该在某个地方可见,但它从来没有出现过)
AJAX调用的接收方法设置了从$_GET
读取的内容的值。
这样可以在后续window.location.href="..."
中生效并重定向到目标网站。
在目标网站上确保为未启用JavaScript的人设置了值。
这似乎是它变得多毛的地方,尽管调试没有显示任何错误这样的行为。
我还检查了某些序列化是否由于某种原因未能序列化2
,但检查/var/lib/php5
中的会话文件显示完全正常且设置正确2
单击选项卡并更改页面后。
在调试会话初始化时(直接在session_start()
之后和序列化对象完成它的唤醒例程之后),我在以下站点请求中发现值为0
(显然单击选项卡并重定向到目标站点后)。所以我认为这将是php解决反序列化问题。因此,我已经创建了另一个用于测试的属性,在其中存储了2
并让它加载了几次,它总是以2
加载。此外,我测试的任何其他浏览器(Firefox和Chrome)都没有任何问题与标签2 ...所以php做傻事也被破坏了。
我想到的Anthoer想法是IE浏览器有趣的隐私内容,它喜欢忘记这样的cookie和笑话,所以我通过所有页面和AJAX请求跟踪会话ID。
它从未改变过。因此,获取具有默认值0
的新会话对象也会被破坏。此外,任何其他选项卡都适用于IE。
最后,我检查了所有AJAX内容的javascript内容。所有三个选项卡都运行完全相同的代码,因此无法通过2
使其失败,但我无论如何都会这样做。
就像我预期的那样,没有什么是错的。所有的呼叫都经过了正确的处理,并得到了服务器的正确响应以继续工作。
现在我不知道要检查或调试的内容。我甚至不理解IE如何能够在请求之间操纵存储在服务器上的文件中的服务器端变量。
我知道它必须与IE有关,因为如果在我的服务器编程中出错,我会在其他浏览器中看到效果,对吗?
有没有人知道我还可以尝试做什么来揭穿这个?
当然,以下是我使用的软件和内容的所有规格:
Windows 7 32位上的Internet Explorer 9.0.8112.16421作为VirtualBox guest(存在错误)
Windows 7 64位上的Internet Explorer 9.0.8112.16421在真机上(存在错误)
Fedora 17 x64上的Firefox 16.0.2在真机上(bug 不存在)
在真实机器上的Windows 7 64位上的Firefox 16.0.1(bug 不存在)
Chrome? (安装〜2周前)在Windows 7 64bit的真机上(bug 不存在)
在真实手机上的Android 2.3.3上的Opera Mobile 12.10.ADR-1211271253(bug 不存在)
服务器是Apache 2.2.16,在Debian 6上使用PHP 5.3.3-7运行内核2.6.32-5-amd64
<小时/> 2012年12月3日更新:
显然它与目标页面中嵌入的Flash视频有关。将其放在其他标签之一的目标页面中,我也能够为其他标签重现问题。
只有加载视频时才会出现这种情况;音频文件不会触发错误。
虽然它有点好奇,因为所涉及的javascript代码除了添加嵌入之外什么都不做。有问题的玩家是 Nonverblaster ,这是免费的,到目前为止没有任何麻烦。
显然它也使用http://code.google.com/p/swfobject/。
随着Flash播放器的卸载,错误也消失了,所以它肯定与这个视频播放器有关。我还不确定它是怎么做的,因为加载.swf和.flv文件与php会话无关,但它似乎在某种程度上这样做。
答案 0 :(得分:2)
当IE向服务器询问.swf时,它似乎不会发送会话cookie。然后,这会导致服务器重新生成cookie。
一些相关的讨论 -
大多数消息来源倾向于同意解决方案是服务器识别与加载Flash内容相关的请求,并将其包含在原始会话中。或者至少阻止创建新会话。