如何使用codeigniter中的htaccess文件将URL重写为特定的控制器类

时间:2017-02-10 08:06:47

标签: php .htaccess codeigniter routing

我的应用程序中有2个名为Localhost / electronics的控制器类。

网址"Localhost/electronics/cameras"转到

"localhost/electronics/home/details/cameras". 

由于规则

,这种情况正在发生
$route['(:any)'] = "home/details/$1";

第二个控制器类specifics(),它的方法showspecifics()可通过URL

访问
`"localhost/electronics/specifics/showspecifics/camera1.` 

如何执行以下操作?

仅使用帮助.HTaccess文件,我想...能够使用网址

访问第二个班级specifics()
`"localhost/electronics/camera1` . 

我知道使用

`$route['(controllername/:any)'] = "specifics/showspecifics/$1";`

是一种接近实现干净URL的可能方式,但这不是我想要的。

请告知如何使用htaccess来完成此任务。

非常感谢任何想法。

1 个答案:

答案 0 :(得分:1)

通常,您将捕获URL的最后部分,然后重写请求,例如

RewriteCond %{REQUEST_URI} !^/electronics/specifics/showspecifics/
RewriteRule ^electronics/(.+)$ /electronics/specifics/showspecifics/$1 [L]

RewriteCond可以防止重写循环。

然而,这不适用于CodeIgniter,因为CodeIgniter会查看REQUEST_URI以确定提供此请求的控制器和方法。但是REQUEST_URI并未更改RewriteRule并且仍为/electronics/camera1,并且CodeIgniter找不到合适的控制器。

要更改REQUEST_URI,您必须重定向而不是重写,例如

RewriteRule ^electronics/(.+)$ /electronics/specifics/showspecifics/$1 [R,L]

但这也改变了客户端的URL栏,在这种情况下不需要。

所以,使用.htaccess和CodeIgniter无法实现这一点。

要在CodeIgniter中执行此操作,您可以在application/config/routes.php中使用适当的路由,例如

$route['(cameras|smartphones|computers)'] = 'home/details/$1';
$route['(:any)'] = 'specifics/showspecifics/$1';

按控制器和方法home/details处理少数类别,控制器和方法specifics/showspecifics处理其他所有类别。