尝试避免自定义 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
我创建了一个脚本来确定用户所在的国家/地区,以便为他们提供特定于该国家/地区的内容(例如货币等)。
此脚本包含在网站所有页面的 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