【问题标题】:How to properly implement a PHP redirect in Drupal 7.x?如何在 Drupal 7.x 中正确实现 PHP 重定向?
【发布时间】:2017-12-01 16:23:19
【问题描述】:

目标:如果用户的起点是伦敦,则将用户重定向到特定的着陆页/路径。

问题: 实现以下重定向方法会返回以下失败结果:

什么都没有发生 >> header("http://mywebsite/subcat");

  1. 重定向过多 >> header("Location: http://mywebsite/subcat");
  2. 重定向过多 >> header("Location: /path");
  3. 重定向过多 >> drupal_goto("http://mywebsite/subcat");
  4. 重定向过多 >> drupal_goto("/path");
  5. 无限循环>> 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';
        }
    }
    ?>

假设

  • 我的代码中有逻辑错误。
  • 重定向方法/逻辑使用不当
  • 我的代码放置不当,会被执行覆盖 其他模块的瀑布。

【问题讨论】:

  • 与您寻求的答案无关,但您应该在发出位置标头后始终调用exitdie。发出标头后代码继续执行,这可能会导致不良副作用。
  • 感谢@Scoots 的提示,但不幸的是,这并没有解决问题。
  • 是的,我说这不是答案,这只是您应该遵循的一般规则。我读到一个相当奇妙的故事,关于一个人在“如果未登录则重定向远离管理员”之后没有打电话给exit;。长话短说,Google 机器人点击了他所有的“删除页面”链接。

标签: php drupal-7


【解决方案1】:

啊哈!时刻:

我非常专注于功能,以至于完全忽略了代码处理的一般过程。我的代码失败的问题是我正在处理关于“页面”或内容到底是什么的 CMS——内容是动态的,因此是动态生成的。因此,一旦我的逻辑测试得到满足,重定向就会导致另一个具有相同逻辑测试的动态生成内容。因此,我创建了一个无限循环。

解决方案

我修改了我的代码,不仅要检查原点,还要检查节点的 ID。所以换句话说正确的测试逻辑如下:

测试起点是否是伦敦,如果加载的节点不是英国登陆节点,则重定向到英国登陆说明。

学有所成!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多