我有这个大问题,我不知道如何解决。我有一个重定向到网址的脚本。
到目前为止,我有:
//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]
有什么想法吗?
答案 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) {
基本上是相同的。