IE/Firefox中有关$_SERVER[';QUERY_STRING';]的怪异行为


Weird behavior in IE/Firefox regarding $_SERVER['QUERY_STRING']

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

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

在我的应用程序中,我使用框架集和框架。这段代码出现在主内容区框架中,在IE中执行时,会创建一个无限循环,除非我手动停止加载,否则会杀死浏览器。

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

编辑

正如我在前面的编辑中所指出的,我使用框架集和框架来控制界面。左侧框架是一个侧栏,包含与主"内容"区域框架的基本目标的链接。内容区域框架的内容包含javascript,该javascript将查询字符串附加到父窗口的url,因此当访问索引页面(存在查询字符串)时,它将把内容框架重定向到该特定页面。

这在Chrome中运行得非常好。不是IE(或firefox,我在编辑时刚刚发现)。Ie改为重定向到索引页面,即包含框架集的页面,它会永远这样做,创建一个又一个侧边栏。

尝试以下操作:

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

我不知道这是否是您的问题,但根据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;
?>

我有点讨厌自己没有早点想到这件事,因为它非常简单。我所做的只是检查$_SERVER['QUERY_STRING']是否为空,如下所示:

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

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