PHP会话不适用于IE

时间:2008-11-20 17:25:03

标签: php internet-explorer session

我有一个用php制作的网站,它在整个网站上使用服务器端会话 实际上,它是一个具有用户登录的站点,它依赖于会话变量,如果所有会话变量出现问题,则根本不会加载任何页面。

在网站上,有一个iframe,其中包含来自其他用户的小消息 这些小消息旁边有可点击的照片,用于打开用户的个人资料 现在,每个页面都需要一些格式来打开该特定页面上的用户配置文件......实际上只有几个问题页面,但这些页面必须具有稍微不同的onclick功能或者它们会中断页面。
因此,我在每个页面($_SESSION["current_page"])上设置了一个会话变量,让Feed知道如何格式化可点击的照片。现在Firefox,Opera,Chrome,Safari都按照预期工作。
但IE6和IE7在需要特殊格式的页面上存在问题 所以在把我的头发拉了一下之后,我最终开始在服务器上打印我的会话变量 并且,在特殊页面上,($_SESSION["current_page"])始终设置为“main”而不是“special1”或“special2”。

我在Firefox和我提到的所有其他浏览器中打印了相同的会话变量,并打印出“special1”或“special2”,因为它们应该如此。
谁能想到一些东西 - 可能与饲料在iframe中的事实有关? - 这会导致IE以不同方式处理服务器端会话变量,或以某种方式在后台静默启动页面“main”? 我已经非常仔细地检查了feed以查找对“main”页面的任何引用 - 它似乎没有任何方式它正在加载该页面。

这对我没有意义。

12 个答案:

答案 0 :(得分:31)

检查服务器计算机的名称。 IE包含“ - ”或“_”的机器名称存在问题 - 它们无法维护会话!我过去曾经遇到过这个问题两次,而且总是需要几个星期的时间来弄明白,我很震惊,IE还没有解决它。

只需将机器重命名为没有奇怪的字符!如果您只是使用网址中服务器的IP地址进行测试,则可以使其正常工作。

答案 1 :(得分:10)

答案 2 :(得分:9)

尝试使用某种监控代理(我使用Fiddler)测试页面,并查看浏览器请求的页面。这可能会为你提供一些线索。

此外,尝试捕获来自不同浏览器的请求/响应,并查看IE的行为方式(请求顺序,请求内容?)。

要查明问题,您是否可以使用SESSION重写代码而不使用(在其他答案之一中提及)?也许IE浏览器的访问顺序与其他浏览器不同?也许它不止一次地请求主页面,这意味着会话var设置为“main”?如果没有会话变量,页面就不会影响彼此的状态。

答案 3 :(得分:3)

我认为有些人可能会发现这个问题的解决方案很有趣。提琴手肯定在这里帮忙。感谢Fiddler,我可以看到我实际上正在访问页面main.php(因此在将目标设置在目标页面上之后设置会话变量),但是服务器在获取302的根目录后默认为网站。这一切都在后台默默发生,之前我的onload =“”javascript运行。

所以我确定某些 on 这些页面导致错误,但不是灾难性的错误。

这里是:<img src= "" >

IE对于空白的src属性以及命中服务器根目录和默认为页面主页感到害怕。我不完全理解这里发生的机制。我也不明白这是不是IE应该如何表现(毕竟它是一个格式错误的img标签)。这是一个错误吗?

答案 4 :(得分:3)

在大多数情况下,文件开头的这个php行就足够了:

header('P3P: CP=”NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM”');

如果不是,对于IE7,您也可以尝试:

header('P3P: CP=”NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM”');

header('Set-Cookie: SIDNAME=ronty; path=/; secure');

header('Cache-Control: no-cache');

header('Pragma: no-cache');

如果这对IE6不起作用,您可以将GET参数用于会话ID:

header('location: land_for_sale.php?phpSESSID='.session_id());

答案 5 :(得分:2)

我发现您是否在文档顶部添加了header('P3P: CP="CAO PSA OUR"');。它似乎解决了这个问题。

答案 6 :(得分:1)

我遇到了这个问题,这是因为我的开发盒上的日期已经出来了。 Firefox并不介意,IE和Chrome认为会话一旦设置就会过期。

答案 7 :(得分:1)

我遇到了同样的问题,现在已经解决了。

任何IMG标记的空白或空属性值都会导致问题。 对我来说,我使用JavaScript将IMG对象的源更改为空值。 这样做也可能导致问题。

答案 8 :(得分:0)

如果我理解正确,您是否尝试使用会话变量将页面中的数据传递到该页面上iframe中的页面?这似乎不是一个很好的方法 - 为什么不将GET变量传递给iframe网址,即?current_page = special1。我认为这会更可靠,因为它不依赖于会话状态。

还要记住,对于在用户PC上打开的同一站点的多个页面(例如,在多个选项卡上),会话变量将是相同的,这可能会导致奇怪的行为。

答案 9 :(得分:0)

会话数据存储在服务器端,而不是客户端。我会检查其他页面,这个值将被设置。

答案 10 :(得分:0)

我对ie7有同样的问题,这就是我所做的:

如果在Windows Server中使用IIS或Apache时遇到此问题,请查看重定向的URL,其编写方式必须与重定向之前的URL相同。

例如: site.com/ 页面 /index.php 重定向到 site.com/ 页面 /index2.php 即将开始在IE7中松开会话,因为页面中的大写字母。

答案 11 :(得分:0)

也许是session.cookie_lifetime。我遇到了同样的问题。我将session.cookie_lifetime: 4500更新为session.cookie_lifetime:0。这意味着会话cookie永远不会过期,直到浏览器关闭。