允许在网址中重复的CodeIgniter类

时间:2018-07-18 01:52:08

标签: php codeigniter

通过全新安装CodeIgniter 2和未修改的welcome.php,如下所示:

class Welcome extends CI_Controller {
    public function index()
    {
        $this->load->view('welcome_message');
    }
}

以及以下请求:

url                                http response expected   actual
/index.php/welcome                               200        200
/index.php/welcome/wtf                           404        404
/index.php/welcome/welcome                       404        200 ?
/index.php/welcome/welcome/welcome               404        200 ?
/index.php/welcome/welcome/welcome/welcome       404        200 ?
/index.php/welcome/welcome/wtf                   404        200 ?

注意最后四个请求。为什么CodeIgniter表现出这种行为?可以禁用吗?

下面是我朴素的快速修复方法,但想知道是否可以进行全局更改以解决其他控制器问题。

class Welcome extends CI_Controller {
    public function index()
    {

        $this->load->helper('url');

        if (strpos(uri_string(), 'welcome/welcome') !== false) {
            show_404();
        }

        $this->load->view('welcome_message');
    }
}

2 个答案:

答案 0 :(得分:1)

查看CI的代码后,我认为这是由fetch_method类的CI_Router函数引起的。看:

function fetch_method()
{
    if ($this->method == $this->fetch_class())
    {
        return 'index';
    }

    return $this->method;
}

因此,路由器的默认行为是,如果方法的名称等于类的名称,则将方法设置为索引。

您应该可以通过在MY_Router.php文件夹中创建一个core文件来覆盖此内容。

<?php

class MY_Router extends CI_Router {

    function fetch_method()
    {
        return $this->method;
    }
}

答案 1 :(得分:0)

我的猜测是第二个welcome必须充当index的别名,这就是它起作用的原因。因此它的值为welcome(controller)/welcome(index/method)/param(passed to method)。但是请不要在此引用我,因为我对CI2不熟悉。

您也许可以执行以下操作(使用您的代码):

class MY_Controller extends CI_Controller {

    public function __construct() {

        $this->load->helper('url');

        $seg1 = $this->uri->segment(1);
        $seg2 = $this->uri->segment(2);

        if (strpos(uri_string(), "{$seg1}/{$seg2}") !== false) {
            show_404();
        }

    }

}

所有控制器都必须扩展存储在MY_Controller中的application/core