CodeIgniter Route rsegment()重复结束值

时间:2013-03-20 17:22:38

标签: php regex codeigniter routing

使用CodeIgniter路由我有这个规则

$route['^(?!login|profile|signup|notification|member).*/(:num)/(:any)/(:any)'] = "home/$2/$0/$1/$3";

我的网址就像这样http://example.com/memberfolder/7/view_document/WjbZpAPHM6

所以基本上代码应该路由到家庭班级中的view_document()方法,其中rsegment(5)为值WjbZpAPHM6

但是,当代码转到主课时,rsegment(5)的值为view_document

正如你所看到的我的路由规则我应该只有5个部分,所以当我打印所有的部分时,我得到了这个:

  

home view_document memberfolder 7 view_document WjbZpAPHM6

正如您所看到的,我的rsegment(5)是重复的或rsegment(2)。即使我只有5个部分,我的文档文件值WjbZpAPHM6也存储在rsegment(6)中。

有关如何将rsegment(5)更正为文档名称的值而不是view_document

的任何建议

此外,我的.htaccess就是这样:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /example/index.php/$1 [L]

2 个答案:

答案 0 :(得分:0)

我对CodeIgniter知之甚少,但我认为你应该替换

$route['^(?!login|profile|signup|notification|member).*/(:num)/(:any)/(:any)'] = "home/$2/$0/$1/$3";

用这个

$route['^(?!login|profile|signup|notification|member).*/(:num)/(:any)/(:any)'] = 'home/$2/$0/$1/$3';

答案 1 :(得分:0)

(:any)将匹配 CI 3.0 中的任何字符/ CI< = 2.1.3 /匹配>

因此,为了使它兼容两个版本,我们只需使用[^/]+代替:any手动输入字符匹配,而不使用CI的简写语法。请注意,我们不会放入括号,因为我们不想创建反向引用。

此外,您不会将^作为CI自动放入。此外,您的反向引用也是错误的。您不使用$0,而是从$1开始并进行操作。我把它们改成了正确的数字。


你的路线应该是:

$route['((?!login|profile|signup|notification|member)|member[^/]+)/(:num)/(:any)/(:any)'] = "home/$3/$1/$2/$4";

因此,对于以下URL示例:

memberfolder/7/view_document/WjbZpAPHM6

反向引用将是:

$1 = memberfolder
$2 = 7
$3 = view_document
$4 = WjbZpAPHM6

现在建立您的请求:

home/$3/$1/$2/$4变为home/view_document/memberfolder/7/WjbZpAPHM6

制作以下内容:

rsegment(1) = home
rsegment(2) = view_document
rsegment(3) = memberfolder
rsegment(4) = 7
rsegment(5) = WjbZpAPHM6