通过全新安装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');
}
}
答案 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