【问题标题】:Finding the source of a redirect call in CodeIgniter在 CodeIgniter 中查找重定向调用的来源
【发布时间】:2023-03-29 01:01:01
【问题描述】:

我继承的 Codeigniter 应用程序有一个 302 重定向,将其从 https url 中移除。如果直接访问 http url,则不会发生重定向。我的问题是,“这个重定向可能发生在哪里?

如果我将脚本执行分解为调用的特定控制器的构造函数,我可以登陆 https 站点。在 index 函数中执行相同的操作将返回 http 站点。

我决定尝试在重定向之前跳过“退出”并简单地回显某些内容,以查看错误指向的位置,并将我引向 url 帮助程序,重定向功能。我不知道那个辅助方法是从哪里调用的。

使用 .htaccess 强制使用 ssl 会导致重定向循环,因此我必须先解决此重定向问题。

虽然下面的示例是登录控制器,但无论调用哪个控制器都会出现问题。

登录控制器:

class login extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->model('mod_login');
        $this->load->helper('date');
        echo "You are here.";// **This is the last place I can cut execution and land on an https site.
        exit;
    }

    function index() {
    }
}

我们将不胜感激任何关于在哪里寻找的帮助。

编辑:

我找到了重定向的位置。在搜索所有配置文件时,我发现了一个设置 $config['enable_hooks'] = true 的位置。当我找到 hooks 文件夹时,有一个 ssl_helper,它有两种方法:force_ssl 和 unforce_ssl。我仍然需要研究 codeigniter 钩子,但是注释掉 unforce_ssl 方法中的代码同时修复了所有问题,同时我试图弄清楚我的前任为什么这样做,以及禁用它的正确方法是什么。

编辑 2017 年 4 月 5 日 感谢 DFriend 花时间研究这个问题。 如果在这个特定的地方发生了中断,在控制器构造之后和控制器方法之前,那么问题出在钩子上。这可以在第 312 行和第 322 行之间的“system/core/Codeigniter.php”中找到。

【问题讨论】:

  • exit; 是您的电话还是在那儿?
  • 我的。我把它放在我的调试尝试中。那是我可以退出脚本并仍然登陆 https 站点的最后一个地方。
  • 好的,很好。不确定我是否理解您的问题。让我们来看看。您浏览到https://examle.com,但最终访问http://example.com。对吗?
  • 没错。这对于 Codeigniter 的一些内部工作来说是特别的,它是一个 php mvc 框架。如果您熟悉 Codeigniter,您可能希望告诉我要查看哪个文件。如果您对 Codeigniter 不是很熟悉,就不可能有太多帮助。

标签: php codeigniter redirect


【解决方案1】:

首先要查看的是application/config/config.php,其中有一个名为$config['base_url'] 的项目,它看起来像这样。

$config['base_url'] = 'http://example.com/';

注意该字符串开头的协议。如果您总是想使用https,请相应地更改字符串。顺便说一下,字符串必须包含协议。

Codeigniter 允许多个config.php 文件。如果这个继承的应用程序正在使用它们,它们将位于application/config/ 的子文件夹中。如果使用此选项,则子文件夹将命名为“production”和“development”。可以想象,可能只有一个子文件夹。在其中(它们)你可能会发现额外的config.php 文件。也检查这些$config['base_url'] 值。

要查找的另一件事是对辅助函数 base_url (documented here) 的任何/所有调用。它接受一个可选的第二个参数(字符串)来定义要使用的协议 - 'http' 或 'https'。

在您的源代码中搜索对辅助函数 redirect (Documented here) 的调用。可能是在第一个参数(URI 字符串)中指定协议。

如果您还没有找到它,请搜索源代码“http”,也许您会发现协议以其他方式强加给您。

首先要检查的文件集是位于application/controllers 中的文件,然后尝试application/libraries,然后是application/models,然后是application/views。最后一种可能性很小。如果通过application/ 子目录列表,这些都没有您正在寻找的工作方式

  1. 核心
  2. 挂钩
  3. 帮手
  4. 包括
  5. 您可以找到的任何其他文件夹 :)

祝你好运。应该不会太难。

【讨论】:

  • 谢谢。在到达控制器本身的过程中,我遍历了每一个。就在最后几分钟,我发现 hooks 文件夹中有一个 ssl_helper。我不知道从哪里调用 ssl_helper unforce_ssl,但现在我禁用了它,一切正常。
  • 如果您编辑答案以建议我查看 application/hooks 文件夹,我会将您的答案标记为已接受。谢谢。
  • 该助手不是 CI 安装的一部分。显然,我想在你的情况下是定制的和无用的。采纳了您的建议 - 请参阅编辑后的答案。
  • 现在您可以搜索所有这些地方以查找拨打ssl_helper unforce_ssl 的电话并将其删除。你是按小时计酬的吧?
  • 谢谢。你是对的,没有人能猜到它。项目有点乱。感谢上帝,时间到了。他们在需要登录的服务上没有 ssl,这一事实让人对问题的状态有所了解。
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 2016-01-30
  • 2011-12-03
相关资源
最近更新 更多