有个问题,就是当用户发出了错误的请求的时候,我们往往把他定向到一个 404.php我写的程序,有些时候可以,有些时候不能重定向,我把代码贴出来给大家看看,帮我分析一下啊,谢谢了比如下面这段代码,如果用户发送了正确的请求,也就是 houses, jobs,等等,是没问题的,如果用户没有发送参数,那么我的程序会自动跳转到 404.php ,但是如果发送了错误的请求,比如 fid="111",就不会跳转的,我把跳转语句放在了 default 中, 这是为什么呢 if( isset($_POST['fid']) ){ switch ($_POST['fid']) {
case "houses" :
$fid = 'GHW_FORUM_MESSAGE_HOUSES';
$rfid = 'GHW_REPLY_HOUSES';
$GLOBALS['MESSAGE']['AREA'] = "HOUSE";
break;
case "jobs" :
$fid = 'GHW_FORUM_MESSAGE_JOBS';
$rfid = 'GHW_REPLY_JOBS';
$GLOBALS['MESSAGE']['AREA'] = "JOBS";
break;
case "friends" :
$fid = 'GHW_FORUM_MESSAGE_FRIENDS';
$rfid = 'GHW_REPLY_FRIENDS';
$GLOBALS['MESSAGE']['AREA'] = "FRIENDS";
break;
case "et" :
$fid = 'GHW_FORUM_MESSAGE_MARKET';
$rfid = 'GHW_REPLY_MARKET';
$GLOBALS['MESSAGE']['AREA'] = "MARKET";
break;
case "travel" :
$fid = 'GHW_FORUM_MESSAGE_TRAVEL';
$rfid = 'GHW_REPLY_TRAVEL';
$GLOBALS['MESSAGE']['AREA'] = "TRAVEL";
break;
case "tutor" :
$fid = 'GHW_FORUM_MESSAGE_TUTOR';
$rfid = 'GHW_REPLY_TUTOR';
$GLOBALS['MESSAGE']['AREA'] = "TUTOR";
break;
case "cars" :
$fid = 'GHW_FORUM_MESSAGE_CARS';
$GLOBALS['MESSAGE']['AREA'] = "CARS";
break;
default:
header('Location: 401.php');
break;
}
}
else{
header('Location: 401.php');
}还有下面这个,如果某两个内容是空的,虽然能进入 if 的语句,但是还是跳转不了的,这是为什么呢? if( empty($_POST['title']) || empty($_POST['context']) ){
header('Location: 401.php');
}

解决方案 »

  1.   

    给两个建议,楼主可以试试看:1. 确保每次浏览器请求都没有被浏览器做缓存。2. 把 default 里面的 break 换成 exit()
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  2.   

    估计页面之前已经有输出了:【php】header("Location:")应该注意的几个问题
     
    header("Location:")作为php的转向语句。其实在使用中,他有几点需要注意的地方。 1、要求header前没有任何输出,这一点要特别注意!!!     但是很多时候在header前我们已经输出了好多东西了,但是此时如果再次header的话,显然是出错的,在这里我们启用了一个ob的概念,这个东东的意思是在服务器端先存储有关输出,等待适当的时机再输出,而不是像现在这样运行一句,输出一句,发现header语句就只能报错了。 具体的语句有: 1、ob_start(); ob_end_clean();ob_flush();.........
    2、在header("Location:")后要及时exit 
        否则他是会继续执行的,虽然在浏览器端你看不到相应的数据出现,但是如果你进行抓包分析的话,你就会看到下面的语句也是在执行的。而且被输送到了浏览器客户端,只不过是没有被浏览器执行为html而已(浏览器执行了header进行了转向操作)。 所以,标准的使用方法是: 
    ob_start();........if ( something ){     ob_end_clean();     header("Location: yourlocation");     exit;else{     ..........     ob_flush();  //可省略}
      

  3.   

    另外header函数后面的代码也是会继续执行的,如果后面还有一些比较耗时的代码也会影响页面跳转,一定要加上 exit,参见以上第二点