使用会话变量时,IE中的PHP重定向

时间:2010-01-04 15:05:20

标签: php redirect session-variables

我有一个小网站,如下所示

  1. 用户进入登录页面并输入凭据(称之为第1页)
  2. 表单发布到第2页,该页面对用户进行身份验证,调用session_start,然后使用$_SESSION['somevar']设置会话变量并重定向到page3
  3. 在第3页上,如果没有将用户发送回登录页面,我会检查是否设置了$_SESSION['somevar']
  4. 代码:

    //here's the code on the top of the page3 
    <?php
        session_start();
        if (!isset($_SESSION['somevar'])) 
        { 
            header("Location:http://somesite") 
        }
        ...other code follows
    

    问题是虽然这在FireFox中有效,但即使使用正确的用户凭据,IE 7也会继续重定向回page1而不是显示page3的内容。

    有些指针请解决这个问题吗?

    编辑:一个非常奇怪的解决方案,但它的工作原理。我改变了

     if (!isset($_SESSION['somevar'])) { header("Location:http://somesite") }
    

     if ($_SESSION['somevar'] == '' ) { header("Location:http://somesite") }
    

    现在IE很高兴。但我仍然不清楚为什么isset在IE中不起作用

    非常感谢

4 个答案:

答案 0 :(得分:0)

调用header函数后,您的脚本需要退出()或die()。

header()不会结束脚本。一些浏览器将继续前进到新位置,而其他浏览器将等待脚本的其余部分运行并显示该输出。除非你调用exit(),否则无论输出是否显示,脚本都会运行。

答案 1 :(得分:0)

的确,你必须在标题之后死去。如果没有,下面的代码将被执行,并且可能导致安全问题,因为并非所有客户端实际都遵循重定向标题(例如,参见搜索引擎蜘蛛)。

您可以检查会话中的实际内容,只是var_dumping其内容。测试期间不会考虑重定向,因为在调用header()之前会将输出发送到浏览器。

<?php
  session_start();

  /* To test: */
  var_dump($_SESSION);

  if (!isset($_SESSION['somevar'])) 
  { 
      header("Location: http://somesite");
      die();
  }

答案 2 :(得分:0)

使用iehttpheasers或wireshark查看IE是否正在发回cookie。我希望你会发现它不是,或者是它不应该缓存页面。

下进行。

答案 3 :(得分:0)

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');

在页面顶部使用它来修复IE7

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

使用?phpSESSID='.session_id()到您的位置:修复IE6