IE / Firefox中关于$ _SERVER ['QUERY_STRING']的奇怪行为

时间:2012-08-01 02:27:39

标签: php internet-explorer redirect

在我编写的基于php的应用程序中,我有以下一小段代码:

if (isset($_SERVER['QUERY_STRING'])) {
    header("Location: " . $_SERVER['QUERY_STRING']);
}

在我的应用程序中,我使用框架集和框架。此代码存在于主内容区域框架中,并且在IE中执行时,会创建一个无限循环,除非我手动停止加载,否则会触发浏览器。

此代码的目的是检测是否在网址后附加了查询字符串,如果是,则重定向到该查询字符串。我主要使用chrome和和firefox 进行开发,今天决定在IE9中测试它。我没有在任何以前的版本中测试它,但到目前为止这种行为只发生在IE中,我坦率地说为什么会发生这种情况。我在这里和互联网上搜索过类似的问题,但到目前为止还没有骰子。

修改

正如我在早期的编辑中提到的,我使用框架集和框架来控制界面。左侧框架(侧边栏)包含与主“内容”区域框架的基础目标的链接。内容区域框架的内容包含将查询字符串附加到父窗口的URL的javascript,以便在访问索引页面时(显示查询字符串),它将内容框架重定向到该特定页面。

这在Chrome中运行得非常好。不是IE(或firefox,我刚刚发现这个编辑)。即改为重定向到索引页面,包含框架集的页面,它会永久地执行此操作,在侧边栏后创建侧边栏。

3 个答案:

答案 0 :(得分:0)

尝试以下方法:

session_start();

if ( !isset($_SESSION['Redirect'] ) && isset( $_SERVER['QUERY_STRING'] ) ) {
    $_SESSION['Redirect'] = true;
    header( "Location: " . $_SERVER['QUERY_STRING'] );
}

答案 1 :(得分:0)

我不知道这可能是你的问题,但根据HTTP / 1.1,重定向需要包括主机名在内的完整绝对路径。所以也许试试这个:

<?php
/* Redirect to a different page in the current directory that was requested */
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = $_SERVER['QUERY_STRING'];
header("Location: http://$host$uri/$extra");
exit;
?>

或者另一个建议是避免使用完整的查询字符串(如?thispage.php),而是使用GET参数(如?path=thispage.php)。

<?php
/* Redirect to a different page in the current directory that was requested */
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = $_GET['page'];
header("Location: http://$host$uri/$extra");
exit;
?>

答案 2 :(得分:0)

我有点讨厌自己没有考虑到这一点,因为它有多么简单。我所做的就是检查$_SERVER['QUERY_STRING']是否为空,如下:

if (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] != '') {
    header("Location: " . $_SERVER['QUERY_STRING']);
}

这解决了索引页面创建无限嵌套框架集和框架的问题。