CodeIgniter 路由不起作用

Posted

技术标签:

【中文标题】CodeIgniter 路由不起作用【英文标题】:CodeIgniter route not working 【发布时间】:2011-11-07 22:40:26 【问题描述】:

我的路由文件中有以下路由:

$route['default_controller'] = "main";
$route['404_override'] = '';
$route['testroute'] = "main";

如您所见,我想要的只是当有人访问 mydomain.com/testroute 时,它​​应该只是路由回默认控制器。但是,当我去那里时,我得到一个 404 错误。我写这条路线的方式有问题吗?

【问题讨论】:

如果你去mydomain.com/index.php/tesroute会发生什么? 现在我得到一个页面,上面写着“没有指定输入文件。” 你的主控制器就是这样做的吗?好吧,无论如何,你确定你的mod_rewrite 工作正常/你的.htaccess 文件设置正确吗? 我的主控制器做了它应该做的事情。如果我只是转到域的根目录,它就可以调用“主”控制器。我将对没有路由的传统控制器进行测试,看看会发生什么。 原来我需要在 .htaccess 中更改这一行: RewriteRule ^(.*)$ /index.php/$1 [L] to RewriteRule ^(.*)$ /index.php? /$1 [L](在 index.php 之后添加问号) 【参考方案1】:

您必须在您的应用中创建.htaccess 文件。

DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA] 

请将此代码粘贴到您的 .htaccess 文件中。

【讨论】:

有同样的问题。你的回答有帮助。谢谢 你拯救了我的夜晚!!!!您的回答帮助我的团队无需加班到午夜。【参考方案2】:

LoneWolfPR 的评论一针见血,你使用的是 FastCGI,它需要不同的 htaccess。

你可以试试这个吗?

https://raw.github.com/pyrocms/pyrocms/develop/.htaccess

我很想建议我们将它添加到 CodeIgniter 2.1-dev 中,以保存这个问题每天出现 15 次。让我知道它是否有效。

【讨论】:

这对我有用。请注意,示例中的链接正在更改,因为它们有许多分支。只需在main page 中找到它,并在 github url 前面加上“原始”子域。我将重写规则放在我的虚拟主机的<Directory> 中,并在 apache2.4 上使用 proxypass 到 php-fpm 对其进行了测试。我在最后使用了规则的“选项 1”+ !mod_php5 规则。【参考方案3】:

听着,这是有史以来最愚蠢的答案,但这是我在类似情况下的经历——刚刚发生。我很无助,但它开始起作用了 - 方法如下。

我有一个控制器,调用者 ReadController.php(类被称为相同)。 路线是一样的:

$route['default_controller'] = "ReadController";

使用www.martinjovanovic.com/DSi1.5-v01/index.php/ReadController/ 调用它 - 有效。 但是只用martinjovanovic.com/DSi1.5-v01/ 调用它根本行不通。

基本网址是我的域和文件夹的网址:www.martinjovanovic.com/DSi1.5-v01/

对 htaccess 没有任何更改,我将其保留为默认值(全部拒绝)。

    我将默认控制器切换回welcome.php。 复制一份,命名为welcome2.php。相应地重命名了类。 将路线更改为welcome2。有效。相同的欢迎屏幕。 将welcome2.php 中的index() 更改为一些echo('something')。它奏效了。 将welcome2.php 重命名为read.php,进行相应的分类。在路线上改变了它。它奏效了。 将原始 ReadController.php 中的整个代码复制粘贴到 read.php 中。它奏效了。

就是这样。同样的事情开始起作用了。

原来的 ReadController.php 和新的 read.php 之间的唯一区别在于第一行。在我的新 read.php 中,我保留了旧 ReadController.php 中实际上缺少的第一行(我猜是我的开发人员省略了它):

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

这是在开始的 php 标记之后立即出现的。 那是唯一的区别。我不明白为什么它会产生如此大的不同。也许根本不是关于它的。尽管如此,它还是奏效了。

这个故事的寓意是:我从一开始就奏效的东西开始,然后慢慢地把它改成我需要的东西,直到它奏效......

【讨论】:

以上是关于CodeIgniter 路由不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter 路由不起作用

具有两个段的CodeIgniter路由不起作用

路由配置在codeigniter中不起作用

CodeIgniter路由在子目录中不起作用

codeigniter 自定义 404 页面不起作用

URI 路由不起作用(多语言)