如何从 url 中删除控制器名称,使其在 codeigniter 中变得干净
Posted
技术标签:
【中文标题】如何从 url 中删除控制器名称,使其在 codeigniter 中变得干净【英文标题】:How to remove controller name from url making it clean in codeigniter 【发布时间】:2012-10-03 12:09:52 【问题描述】:我有以下网址..
http://localhost/ci/site_controller/home
我想从 url 中删除 site_controller
controller 导致..
http://localhost/ci/home
如何在 CodeIgniter 中做到这一点?
注意:如果你问我尝试了什么,而不是我刚刚在 Google 上搜索,因为我不知道如何使用 mod_rewrite。
编辑
我的 routes.php 中有这个
$route['default_controller'] = "site_controller/home";
$route['ci/home'] = 'ci/site_controller/home';
$route['404_override'] = '';
但还是不行!
.htaccess
RewriteEngine On
RewriteBase /ci/
RewriteCond %REQUEST_URI ^system.*
RewriteRule ^(.*)$ /index.php/$1 [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ index.php/$1 [L]
ErrorDocument 404 /index.php
【问题讨论】:
htaccess mod_rewrite 和许多其他的可能重复 在没有控制器的情况下写入 url 时出现 404 Page not found 错误 【参考方案1】:如果您想在 Codeigniter 3.x 中从 URL 中删除控制器名称,那就太简单了 在我的例子中,网址是:http://localhost:8080/index.php/page/sometext 其中“页面”是控制器名称 打开应用程序/config/routs.php
$urlParam = $this->uri->segment_array()[1];
$rout[$urlParam] = "page/index";
结果:http://localhost:8080/index.php/sometext
我向你保证,它会起作用的。测试 100%。
【讨论】:
【参考方案2】:如果你的 .htaccess 文件是这样设置的(或类似的),那么 index.php 已经被删除了......
RewriteEngine On
RewriteCond $1 !^(index\.php|application|assets|images|js|css|uploads|favicon.png)
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ index.php/$1 [L]
而您的 codeigniter 代码直接位于 html 文件夹中...
要从 URL 中删除控制器名称,请编辑 application/config/routes.php 添加如下行:
$route['signin'] = 'web/signin';
当用户请求 yoursebsite.com/signin
时,上面的行调用控制器 Web 的函数 signin()要将变量传递给所述函数,请执行以下操作:
$route['p/(:any)'] = 'web/p/$1';
这一行调用了控制器Web中的函数p(),它有一个参数。 p() 函数定义为:
public function p($param = "none")
echo $param;
我希望这会有所帮助:)
【讨论】:
【参考方案3】:这对我有帮助。在“routes.php
”中我添加了这个:
$route['(:any)'] = "default_controller/$1";
【讨论】:
【参考方案4】:这可能有助于您为 CodeIgniter 项目定义一个默认控制器。
https://codeigniter.com/user_guide/general/controllers.html#defining-a-default-controller
例如,在您的情况下,打开您的 application/config/routes.php 文件并设置此变量:
$route['default_controller'] = 'site_controller';
【讨论】:
【参考方案5】:尝试使用路由文件重新映射 url
http://ellislab.com/codeigniter/user_guide/general/routing.html
【讨论】:
【参考方案6】:我刚刚在此链接中找到了解决方案,它对我有用:http://ellislab.com/forums/viewthread/148531/
$route['^(page1|page2|page3|page4)(/:any)?$'] = "YOURCONTROLLERNAME/$0";
希望对你有帮助:)
【讨论】:
好的,这应该可行:$route['^(:any)(/:any)?$'] = "MainCtrl/$0";【参考方案7】:从您的路线中删除'ci'
。这是您的项目名称,从不需要。路由总是从控制器级别开始:
$route['home'] = "site_controller/home";
会工作。然而,更重要的是......你确定你的设计是正确的吗?为什么不让home
成为一个控制器?创建一个/application/controllers/home.php
,您就可以使用http://localhost/ci/home
访问它的index()
函数。
你把事情复杂化了。根本不需要路线。
【讨论】:
然后从该控制器运行的任何页面都将是 /ci/home/whatever。还是您建议为每个页面创建一个控制器? 我创建所有应用程序的方式——以及 CodeIgniter 文档建议的方式就是这样做。为页面使用控制器,当您需要与该页面交互时(例如 POST 数据),在该页面的控制器中使用单独的函数。controllers/about.php
,controllers/home.php
,controllers/contact.php
等 - 是有效的设计。
很公平,我更喜欢在一个控制器中对类似页面进行分组,但是我们的网站有很多页面,所以我按照自己的方式来做是有意义的。各有各的。
这真的只是设计偏好的问题。 将工作。由您决定是否要让控制器名称作为入口点并避免编写路由 - 或者 - 让函数名称作为入口点并编写路由。建议前者,但这是你的决定。当您想开始在控制器上设置权限时,后一种方法可能会变得很麻烦。构造函数通常可以用于前者,但不适合您提出的方式。
为此我有单独的基本控制器,MY_Controller、User_controller、Admin_controller,然后我只需使用常规控制器处理这些主要组中的各个角色【参考方案8】:
假设您当前拥有您的网址 http://localhost/ci/site_controller/home
,您可以编写如下所示的显式路由到您的 /application/config/routes.php
$route['ci/home'] = 'site_controller/home';
或
$route['ci/home'] = 'ci/site_controller/home';
如果你的控制器被命名为/application/controllers/ci/
【讨论】:
【参考方案9】:您可以为每个 url 设置路由:
在您的 config/routes.php 文件中,只需像这样设置每个页面:
$route['ci/home'] = "ci/site_controller/home";
【讨论】:
如果你的 url 中没有 index.php,你显然已经开启了 mod_rewrite。你确定http://localhost/ci/site_controller/home
真的有效吗?
你能发布你的 .htaccess 文件吗?
查看有问题的 .htaccess
你的 base_url 设置是什么?以上是关于如何从 url 中删除控制器名称,使其在 codeigniter 中变得干净的主要内容,如果未能解决你的问题,请参考以下文章
从 url 中删除控制器名称不适用于 cakephp 中的多个控制器
如何以编程方式从控件自己的更改事件中更改选择框选择并使其在移动浏览器中工作