【发布时间】:2017-12-01 16:23:19
【问题描述】:
目标:如果用户的起点是伦敦,则将用户重定向到特定的着陆页/路径。
问题: 实现以下重定向方法会返回以下失败结果:
什么都没有发生 >> header("http://mywebsite/subcat");
- 重定向过多 >> header("Location: http://mywebsite/subcat");
- 重定向过多 >> header("Location: /path");
- 重定向过多 >> drupal_goto("http://mywebsite/subcat");
- 重定向过多 >> drupal_goto("/path");
- 无限循环>> JS: window.location.replace("http://example.com/path");
实施: 我从几个不同的 SO 帖子中破解了以下脚本(一旦我记得我正在搜索哪些帖子,我就会给予信任),当在独立的 php 中使用时效果很好(使用上面列出的所有重定向方法),但是放置作为 header.tpl.php 上方的第一块代码(或在我的自定义模块中 [使用 hook_init]),产生与问题下列出的相同结果。
使用的功能:
<?php
function get_client_ip ()
{
if (!isset ($_SERVER['REMOTE_ADDR'])) {
return NULL;
}
$proxy_header = "HTTP_X_FORWARDED_FOR";
if (array_key_exists ($proxy_header, $_SERVER)) {
$client_ip = trim (end (explode (",", $_SERVER[$proxy_header])));
if (filter_var ($client_ip, FILTER_VALIDATE_IP)) {
return $client_ip;
} else {
// Validation
}
}
return $_SERVER['REMOTE_ADDR'];
}
$ip = get_client_ip(); // the IP address to query
$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip));
if($query && $query['status'] == 'success') {
if ($query['country'] == "United Kingdom"){
header("Location: /mypath");
} else {
echo 'Unable to get location';
}
}
?>
假设
- 我的代码中有逻辑错误。
- 重定向方法/逻辑使用不当
- 我的代码放置不当,会被执行覆盖 其他模块的瀑布。
【问题讨论】:
-
与您寻求的答案无关,但您应该在发出位置标头后始终调用
exit或die。发出标头后代码继续执行,这可能会导致不良副作用。 -
感谢@Scoots 的提示,但不幸的是,这并没有解决问题。
-
是的,我说这不是答案,这只是您应该遵循的一般规则。我读到一个相当奇妙的故事,关于一个人在“如果未登录则重定向远离管理员”之后没有打电话给
exit;。长话短说,Google 机器人点击了他所有的“删除页面”链接。