标题位置无限重定向循环

时间:2014-06-10 20:56:44

标签: php

我有这个大问题,我不知道如何解决。我有一个重定向到网址的脚本。

到目前为止,我有:

//do some mysql
$geo_included = true; //trying to fix infinite redirect loop.
if($geo_included === true){
    header('Location: '.$url["url"]); //this is causing the issue with redirect loop
}

$ url [" url"]例如:www.google.com

但是当我转到那个PHP文件时,它会重定向到:

www.sitename.com/www.google.com

并说有一个无限重定向循环。注意:上面的标题位置脚本不在while / for / foreach循环中。

这是我的.htaccess /目录

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?group=$1 [L]

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

您需要在计划中包含完全限定的域名,否则它将被解释为在当前域中:

header('Location: google.com'); // Redirects to http://cursite.com/www.google.com
header('Location: http://google.com'); // Redirects as expected

如果您不确定您的网址是否包含计划,请查看parse_url的结果。

$url_scheme = parse_url($url, PHP_URL_SCHEME);
// www.google.com -> NULL
// http://google.com -> string(4) "http"
// ftp://site.com -> string(3) "ftp"

答案 1 :(得分:0)

此处的快速概念验证解决方案是将http://添加到URL,如下所示:

$geo_included = true;

if ($geo_included) {
    header('Location: http://' . $url["url"]);
}

我说“概念证明”因为您应该做的是确保$url["url"]始终附加协议。在进入数据库之前,或者在此代码段中,通过检查$url["url"]值来查看它有http://https://,如果没有,请在它前面添加。这里有一个快速抛出的例子,我的意思应该有用:

$geo_included = true;

if ($geo_included) {
    $protocol = (!preg_match("~^(?:ht)tps?://~i", $url["url"])) ? 'http://' : null;
    header('Location: ' $protocol . $url["url"]);
}

$protocol = …的行执行我之前解释过的检查。如果不存在,则默认添加http://

此外,请注意我删除了=== true,因为if ($geo_included) {基本上是相同的。