1

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

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

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

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

编辑

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

这在 Chrome 中运行良好。不是 IE(或 firefox,我在本次编辑时才发现)。即重定向到索引页面,包含框架集的页面,它永远这样做,在侧边栏之后创建侧边栏。

4

3 回答 3

0

Try the following:

session_start();

if ( !isset($_SESSION['Redirect'] ) && isset( $_SERVER['QUERY_STRING'] ) ) {
    $_SESSION['Redirect'] = true;
    header( "Location: " . $_SERVER['QUERY_STRING'] );
}
于 2012-08-01T02:33:44.317 回答
0

我不知道这是否是您的问题,但根据 HTTP/1.1,重定向需要完整的绝对路径,包括 hostname。所以也许试试这个:

<?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;
?>
于 2012-08-01T02:55:36.677 回答
0

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

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

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

于 2012-08-01T02:57:51.180 回答