刚刚从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
}
}
希望有人能帮助我解决这个问题。
答案 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无关。