在我编写的一个基于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']);
}
这解决了索引页创建无限嵌套框架集和框架的问题。