PHP Header()重定向在重定向到new之前会短暂显示旧URI

时间:2012-05-20 21:42:14

标签: php redirect http-headers

现在,我正在使用自定义PHP解决方案强制将WWW附加到我的脚本URL,因为我使用WordPress的.htaccess规则来“清理”index.php。强制WWW .htaccess规则与WordPress的index.php清理规则不兼容。

使用我的脚本,您可以浏览到“http://scripturl.com/whatever” - 我的脚本然后有一个请求URI“/ what”的案例,然后执行一些操作(或编译相应的模板)图。

我在调用任何交换机之前添加了一系列检查,这确保来自REQUEST的HTTP主机与我脚本中已定义变量的HTTP主机匹配。这会强制添加“www”。

我的问题 - 是(看似只使用IE时) - 当我输入网址时,说“http://myscript.com/whatever”,我的脚本将网址转换为“http://www.myscript。 com / whatever“,按预期方式,然后将标头重定向到新URL。但是,如果我将URI请求从“what”更改为“somethingelse”,页面会按预期转到“http://www.myscript.com/somethingelse”,但是在短暂的一秒内,“无论如何”在URL中闪烁在脚本重定向到“http://www.myscript.com/somethingelse”之前。

澄清:从请求“www.myscript.com/sam”开始。请求加载。 将/ sam更改为/ bob - >页面更改为“www.myscript.com/bob”,但“/ sam”在/ bob加载之前在网址栏中短暂闪烁。

它感觉不到“干净”。我觉得我的代码可能会做一个额外的标题跳转或其他东西。我将此与wordpress进行了对比,转到“www.wordpressurl.com/valid-page”,然后将URI更改为“www.wordpressurl.com/another-valid-page” - 我不要在尝试访问“/ another-valid-page”时,在URL栏中看到“/ valid-page”flash,反之亦然。

这是我的代码:

// Requested URL built from url in address bar
$requested_url  = is_ssl() ? 'https://' : 'http://';
$requested_url .= $_SERVER['HTTP_HOST'];
$requested_url .= $_SERVER['REQUEST_URI'];

// Correct url built from predefined variable
$correct_url = is_ssl() ? 'https://' : 'http://';

// "Correct" script url
$user_home = @parse_url('http://www.myscript.com');

if ( !empty($user_home['host']) )
  $correct_url .= $user_home['host'];
else {
  die('malformed url');
}

$correct_url .= $_SERVER['REQUEST_URI'];

// If URL in address bar is not proper, perform redirect (preserve URI)
if ($correct_url != $requested_url) {
  hc_redirect($correct_url, 301);
}

// Get page from request, handle accordingly
$page = $_SERVER['REQUEST_URI'];
switch ($page) {
  /* Index */
  case '/':
    echo "Index queried <br />";

    break;
    ...

为什么在加载新URI之前,旧的URI会在导航栏中闪烁(来自重定向)?就像我说的,这似乎只发生在IE中 - 但WordPress没有相同的行为(在IE或任何其他浏览器中),所以我知道我的代码肯定有问题,这是一个“额外的步骤”,没有我的知识。我对PHP有点新鲜。

有什么想法吗?

编辑:hc_redirect和其他使用过的函数:http://pastebin.com/fVNEckEg

1 个答案:

答案 0 :(得分:2)

您的脚本在重定向后继续输出数据,浏览器会等待数据,然后才会重定向。如果在发送重定向标头后不需要继续执行脚本,请停止脚本的执行。例如:

// If URL in address bar is not proper, perform redirect (preserve URI)
if ($correct_url != $requested_url) {
    hc_redirect($correct_url, 301);
    die();
}