在我编写的基于php的应用程序中,我有以下一小段代码:
if (isset($_SERVER['QUERY_STRING'])) {
header("Location: " . $_SERVER['QUERY_STRING']);
}
在我的应用程序中,我使用框架集和框架。此代码存在于主内容区域框架中,并且在IE中执行时,会创建一个无限循环,除非我手动停止加载,否则会触发浏览器。
此代码的目的是检测是否在网址后附加了查询字符串,如果是,则重定向到该查询字符串。我主要使用chrome和和firefox 进行开发,今天决定在IE9中测试它。我没有在任何以前的版本中测试它,但到目前为止这种行为只发生在IE中,我坦率地说为什么会发生这种情况。我在这里和互联网上搜索过类似的问题,但到目前为止还没有骰子。
修改
正如我在早期的编辑中提到的,我使用框架集和框架来控制界面。左侧框架(侧边栏)包含与主“内容”区域框架的基础目标的链接。内容区域框架的内容包含将查询字符串附加到父窗口的URL的javascript,以便在访问索引页面时(显示查询字符串),它将内容框架重定向到该特定页面。
这在Chrome中运行得非常好。不是IE(或firefox,我刚刚发现这个编辑)。即改为重定向到索引页面,包含框架集的页面,它会永久地执行此操作,在侧边栏后创建侧边栏。
答案 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']);
}
这解决了索引页面创建无限嵌套框架集和框架的问题。