只有默认控制器工作,其他控制器/路由不工作

时间:2016-08-27 21:50:23

标签: codeigniter codeigniter-3

刚刚从Code Igniter 2.2升级到Code Igniter 3。

网站是plaster.tv。然而,即使指定了其他路由,主页仍可正常工作,但任何其他URL都会路由到此default_controller:

/application/config/routes.php

$route['default_controller'] = "home";
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

$route['login'] = 'login';
$route['signup'] = 'signup';
$route['main'] = 'main';
$route['sendResetEmail'] = 'sendResetEmail';
$route['resetPassword'] = 'resetPassword';

由其他控制器处理的内部页面,例如plaster.tv/signup不起作用,但plaster.tv/?c=signup有效。

/application/config/config.php

$config['base_url'] = 'http://www.plaster.tv/';
$config['index_page'] = '';
$config['uri_protocol'] = 'REQUEST_URI'; //worked using AUTO in CI 2.2
$config['url_suffix'] = '';
$config['subclass_prefix'] = 'MY_';
$config['composer_autoload'] = FALSE;
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
$config['allow_get_array'] = TRUE;
$config['enable_query_strings'] = TRUE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
$config['directory_trigger'] = 'd';

/application/controllers/Home.php

<?php if (!defined('BASEPATH')) {
    exit('No direct script access allowed');
}

class Home extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->library('form_validation');
    }

    public function index()
    {
    //... this part works
    }
}

/application/controllers/Signup.php

<?php if (!defined('BASEPATH')) {
    exit('No direct script access allowed');
}

class Signup extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
  {
//... this class is never called when the URL is http://www.plaster.tv/signup but is called when the URL is http://www.plaster.tv/?c=signup 
 }
}

希望有人能帮助我解决这个问题。

3 个答案:

答案 0 :(得分:1)

设置$config['enable_query_strings'] = FALSE时,强制CodeIgniter(CI)使用查询字符串。这就是为什么plaster.tv/?c=signup有效,但plaster.tv/signup没有。

要以某种方式浏览控制器,您不能同时使用它们。如果您不想使用查询字符串来调用控制器,那么您需要

$config['enable_query_strings'] = TRUE;

此设置并不意味着您无法将查询字符串附加到与CI一起使用的URL。只要$this->input->get('some_key');

,就可以使用$config['allow_get_array'] = TRUE;在控制器中访问任何此类查询项

与您的问题无关但您可能想知道:以下行不是必需的,应该删除

$route['login'] = 'login';
$route['signup'] = 'signup';
$route['main'] = 'main';
$route['sendResetEmail'] = 'sendResetEmail';
$route['resetPassword'] = 'resetPassword';

如果要重新映射CodeIgniter在URL字符串与其对应的控制器/方法之间的正常URI关系,则只需要定义路由。

上述任何一个都可以使用http://plaster.tv/name_of_controller浏览,而无需在routes.php中进行任何设置 - 假设请求的控制器中有index()方法。

答案 1 :(得分:1)

将CI2更改为CI3后的情况相同。所有控制器(包括不存在的控制器)都路由到默认控制器。

要解决此问题,请将Language support logs: WARNING: Using incubator modules: jdk.incubator.httpclient [Error - 2:25:48 PM] Jul 11, 2018, 2:25:38 PM Error occured while building workspace. Details: message: Syntax error on token "module", interface expected;code: 1610612940 message: Syntax error on token ".", , expected;code: 1610612940 message: Syntax error on token "module", interface expected;code: 1610612940 message: The project was not built since the source file /jdt.ls-java-project/src/com/demo/App.java could not be read;code: 0 更改为$config['enable_query_strings'] = TRUE;

答案 2 :(得分:0)

我遇到了同样的问题,并尝试了几乎所有在线阅读的内容,并牢记我之前使用Codeigniter开发了许多站点。但是这次我确实改变的一件事是我的机器和XAMPP设置了。我发现问题是由于XAMPP本身的配置引起的。虚拟主机文件配置不正确,尽管默认控制器在运行,但其他任何操作都没有。

我所做的纠正操作是确保将以下行添加到XAMPP中的httpd-vhosts.conf文件中:-

<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs"
ServerName localhost
    <Directory "C:/xampp/htdocs">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

然后为我的每个虚拟主机设置以下标签:-

<VirtualHost *:80>
DocumentRoot "D:/Development Websites/testsite1/httpdocs"
ServerName testsite1.com
ErrorLog "logs/testsite1-error-log.log"
    <Directory "D:/Development Websites/testsite1/httpdocs">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

这样做之后,我所有的控制器现在都可以正常工作了。最终与CI config或.htaccess无关。