尝试避免自定义 php 地理定位脚本中的重定向循环

Trying to avoid redirect loop in custom php geolocation script

我创建了一个脚本来确定用户所在的国家/地区,以便为他们提供特定于该国家/地区的内容(例如货币等)。

此脚本包含在网站所有页面的 header 中,因为我希望他们能够根据需要更改国家/地区(例如,他们可能在国外,但仍需要国内的内容)。

如果找到发布的变量,它将更改国家/地区并重定向回主页。然而,这将导致重定向循环,因为脚本也包含在此页面和其他页面上,然后再次查找发布的变量但找不到它。

我不会为所有国家/地区提供自定义内容,只是我在数据库中保存的特定国家/地区。

我的脚本如下

<?php
$ip;
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
$content = file_get_contents('https://tools.keycdn.com/geo.json?host='.$ip);
$jsonArray = json_decode($content, true);
$country = "";
foreach($jsonArray['data']['geo'] as $key => $value){
    if($key != 'country_name'){
    }else{
        $country = $value;
    }
}

$active_country_id;
$active_country_name = "";
$active_country_code;
$active_country_currency;

$country_active = "";
$country_menu = "";

if(!isset($_GET["country_id"])){
    $sql1 = mysqli_query($con, "SELECT * FROM countries WHERE country='$country'");
    $countryCount1 = mysqli_num_rows($sql1);
    if ($countryCount1 > 0) {
        while($row = mysqli_fetch_array($sql1)){ 
            $active_country_id = $row["id"];
            $active_country_name = $row["country"];
            $active_country_code = $row["code"];
            $active_country_currency = $row["currency"];

            $country_active .= "$active_country_code";
            $country_active .= " - ";
            $country_active .= "$active_country_name";
        }
    } else {
        $country_active = "No Countries";
    }
}else{
    $new_country_id = $_GET["country_id"];
    $sql1 = mysqli_query($con, "SELECT * FROM countries WHERE id='$new_country_id'");
    $countryCount1 = mysqli_num_rows($sql1);
    if ($countryCount1 > 0) {
        while($row = mysqli_fetch_array($sql1)){ 
            $active_country_id = $row["id"];
            $active_country_name = $row["country"];
            $active_country_code = $row["code"];
            $active_country_currency = $row["currency"];

            $country_active .= "$active_country_code";
            $country_active .= " - ";
            $country_active .= "$active_country_name";
        }
    } else {
        $country_active = "No Countries";
    }
    //header("location: index.php"); 
}

$sql2 = mysqli_query($con, "SELECT * FROM countries WHERE country!='$active_country_name'");
$countryCount2 = mysqli_num_rows($sql2);
if ($countryCount2 > 0) {
    while($row = mysqli_fetch_array($sql2)){ 
        $country_id = $row["id"];
        $country_name = $row["country"];
        $country_code = $row["code"];
        $country_currency = $row["currency"];

        $country_menu .= "<li><a href='country.php?country_id=$country_id'>";
        $country_menu .= "$country_code";
        $country_menu .= " - ";
        $country_menu .= "$country_name";
        $country_menu .= "</a></li>";
    }
} else {
    $country_menu = "No other Countries";
}
?>

我想在注释掉的行上执行重定向 //header("location: index.php");

如有任何帮助,我们将不胜感激。

您已将重定向放在 else 中,其中 country_id 作为请求存在。您应该查找缺少 country_id 的位置,然后使用 country_id.

重定向

重构成

自己的代码会更容易阅读
if (true) {
    // stuff
} else {
    // other stuff
}

如果你使用 if (!$something) 后跟一个 else,else 就变成了双重否定(不是 not)并且读起来很混乱。首先尝试使用 if ($_GET...),然后使用 else

或者...您也可以没有 else 并设计您的脚本,只在需要时进行重定向,否则让它继续。

if (!$_GET['country_id']) {
    // redirect with country_id
}
// Carry on with page as normal