【问题标题】:PHP how to do elseif final else statement to cover all other posibilitiesPHP如何做elseif final else语句以涵盖所有其他可能性
【发布时间】:2018-08-29 22:18:11
【问题描述】:

我有一个用于 cloudflare 的 georedirect 代码,如下所示

<?php

$URI = $_SERVER['REQUEST_URI'];
$activepage = $_SERVER['SERVER_NAME'];
$country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];

if ($activepage=="www.example.co.uk" & $country_code=="CA") {
$link = 'http://www.example.us' . $URI;
header("location:$link");
exit;
}
elseif ($activepage=="www.example.co.uk" & $country_code=="US") {
$link = 'http://www.example.us' . $URI;
header("location:$link");
exit;
}
elseif ($activepage=="www.example.us" & $country_code=="GB") {
$link = 'http://www.example.co.uk' . $URI;
header("location:$link");
exit;
}
elseif ($activepage=="www.example.us" & $country_code=="UK") {
$link = 'http://www.example.co.uk' . $URI;
header("location:$link");
exit;
}

?>

有效地将英国/英国用户从美国网站重定向回英国网站,并将英国网站上的美国和加拿大用户重定向到美元网站 (.us)

我想添加一个最后的 else 语句,以便美国网站上所有非美国或加拿大的流量都被重定向到英国网站(对于世界其他地方也是如此)。

我最好怎么做?

另外,这似乎需要很长时间才能运行(在一台好的服务器上)我如何才能简化它,让它只运行到它需要的地方?例如。遇到正确的elseif后,其他elseif不在后台运行吗?我以为 exit();会做的伎俩,但显然不是。

谢谢

【问题讨论】:

  • 使用&amp;&amp;而不是按位&amp;
  • 谢谢@PHPglue 的意义何在?
  • @PHPglue 我认为 elseif ($activepage=="www.example.us") 的最终声明将涵盖所有其他国家,但显然这不仅仅是挂起和冻结?
  • 你应该可以在你最后的elseif 后面加上die;exit; (括号不是真的需要)。无论如何,当 Apache 处理完页面后,页面应该 die;,所以我不能说为什么这需要任何时间才能运行。

标签: php redirect server header geolocation


【解决方案1】:

因此,您需要添加一个新的elseif,用于标识“站点在美国,流量不是美国,流量不是 CA”并重定向到英国站点。

这是一个关于如何做到这一点的想法 - 我已经稍微整理了代码,结合了具有相同结果的条件,并整理了逻辑(不改变它)。它没有经过测试,但可以根据需要使用它:

$URI = $_SERVER['REQUEST_URI'];
$activePage = $_SERVER['SERVER_NAME'];
$countryCode = $_SERVER["HTTP_CF_IPCOUNTRY"];
$redirectTld = '';

if (
    $activePage == 'www.example.co.uk' 
    && ($countryCode == 'CA' || $countryCode == 'US')
) {
    $redirectTld = 'us';
} elseif (
    $activePage == 'www.example.us'
    && ($countryCode == 'GB' || $countryCode == 'UK')
) {
    $redirectTld = 'co.uk';
} elseif (
    $activePage == 'www.example.us'
    && $countryCode != 'US'
    && $countryCode != 'CA'
) {
    $redirectTld = 'co.uk';
}

if ($redirectTld) {
    header('location: http://www.example.' . $redirectTld . $URI);
    exit;
}

请注意,这不是全部,因为仍然需要满足条件,如果您想要真正的全部捕获,您只需要一个没有条件的} else {(但这似乎没有成为你的问题:) )

您可以通过获取页​​面的 TLD 而不是 $activePage 的完整 URL 并仅检查 url 来进一步整理它(但我不知道您的所有数据/信息是如何工作的)。

这似乎需要很长时间才能运行(在一台好的服务器上)如何 我可以简化它,让它只运行到它需要的地方吗?例如。这 在正确的一个之后,其他 elseif 不在后台运行 见过?我以为是exit();

这一小块条件不应该是瓶颈,它可能是重定向时间(重定向并连接到另一个 URL 甚至服务器?),或其他什么。

一旦条件不满足,PHP 将停止评估一个条件,一旦满足一个条件,就不会评估其他条件,因为它们是“else”。
https://stackoverflow.com/a/2535578/2632129

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2021-12-29
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多