PHP URL重定向脚本迁移新服务器后出现Undefined index错误求修复方案
错误原因
所有Undefined index报错本质是新服务器的PHP版本错误报告等级配置更严格,旧服务器默认屏蔽了Notice级别的提示,因此之前没有暴露问题。报错核心是代码直接读取$_GET超全局变量中的参数,当这些参数不存在于当前请求URL中时,PHP就会抛出索引不存在的提示。
修复方案
在不修改原有重定向逻辑的前提下,只需在代码最开头预先声明所有用到的GET参数的默认值,即可解决所有报错,修复后的完整代码如下:
// 预先给所有用到的GET参数设置默认值 $_GET['idsub'] = $_GET['idsub'] ?? ''; $_GET['idsub2'] = $_GET['idsub2'] ?? ''; $_GET['idf'] = $_GET['idf'] ?? ''; $_GET['idp'] = $_GET['idp'] ?? ''; $_GET['page'] = $_GET['page'] ?? ''; $_GET['demmi'] = $_GET['demmi'] ?? ''; $_GET['key'] = $_GET['key'] ?? ''; $_GET['vals'] = $_GET['vals'] ?? ''; if(!empty($_GET['idsub'])||!empty($_GET['idsub2'])||!empty($_GET['idf'])||!empty($_GET['idp'])) header("Location: /_".preg_replace('/\.php$/','',$_GET['idsub'])."/_".preg_replace('/\.php$/','',$_GET['idsub2'])."/_".preg_replace('/\.php$/','',$_GET['idf'])."/_".preg_replace('/\.php$/','',$_GET['idp']).($_GET['page']?"?page=".$_GET['page']:''),301); if($_GET['idp']=='.php')unset($_GET['idp']); if($_GET['idsub']=='.php')unset($_GET['idsub']); if($_GET['idsub2']=='.php')unset($_GET['idsub2']); if($_GET['idf']=='.php')unset($_GET['idf']); if($_GET['demmi']!='true' && (!empty($_GET['idsub'])||!empty($_GET['idsub2'])||!empty($_GET['idf'])||!empty($_GET['idp']))){ $key=(empty($_GET['idf'])?'':'1').(empty($_GET['idsub'])?'':'2').(empty($_GET['idsub2'])?'':'3').(empty($_GET['idp'])?'':'4'); $vals=(empty($_GET['idf'])?'':'/'.preg_replace('/.php$/','',$_GET['idf'])).(empty($_GET['idsub'])?'':'/'.preg_replace('/.php$/','',$_GET['idsub'])).(empty($_GET['idsub2'])?'':'/'.preg_replace('/.php$/','',$_GET['idsub2'])).(empty($_GET['idp'])?'':'/'.preg_replace('/.php$/','',$_GET['idp'])); $vals=preg_replace('/\/([^\/]*)$/','./$1',$key.$vals); header("Location: /$vals".(empty($_GET['page'])?'':'?page='.$_GET['page']),301); } if($_GET['demmi']=='true' ) { $key=str_split($_GET['key']); $i=0; $vals=explode('/',str_replace('./','/',$_GET['vals'])); foreach($key as $h) {switch($h) {case '1': $_GET['idf']=$vals[$i].'.php'; break; case '2': $_GET['idsub']=$vals[$i].'.php'; break; case '3': $_GET['idsub2']=$vals[$i].'.php'; break; case '4': $_GET['idp']=$vals[$i].'.php'; break;} $i++;} } $idf=$_GET['idf']; $idsub=$_GET['idsub']; $idsub2=$_GET['idsub2']; $idp=$_GET['idp']; $page=$_GET['page']; if (isset($page)) { $page=$page; } else { $page=1; }
可选快速方案
如果不需要排查这类提示信息,也可以直接在脚本最开头加入一行代码error_reporting(E_ALL & ~E_NOTICE);,直接屏蔽所有Notice级别的错误提示,无需修改原有逻辑也可解决报错问题。
内容的提问来源于stack exchange,提问作者amadou
相关产品推荐
相关产品推荐

