在CodeIgniter路由中使用问号

时间:2012-04-09 13:45:36

标签: php regex codeigniter routing wildcard

我需要改变

http://mysite.com/profile?username=nick

http://mysite.com/user/nick

使用CodeIgniter路由。我将以下行添加到routes.php,但它不起作用:

$route['user/(:any)'] = "profile?username=$1";

以下是我使用的.htaccess文件:

RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
AddDefaultCharset utf-8

我该如何解决这个问题?提前谢谢。

修改

我指的是URL结构的变化。因此,在路由之后,它必须重定向

http://mysite.com/user/nick

http://mysite.com/profile?username=nick

3 个答案:

答案 0 :(得分:1)

处理重定向的Htaccess规则:

RewriteRule user/([^/?]+) /profile?username=$1 [L,R=301]

Route.php更改:

<?php
$route['profile'] = 'profile/index';

配置文件控制器:

<?php
class Profile extends CI_Controller {

    public function index()
    {
        $username = $this->input->get('username');
        // do lookup based on username
    }
}

HOWEVER :这种重定向只有在你有很多无法改变的缓存链接时才有意义。从您的问题来看,您可能会混淆路由和重定向的概念。


编辑:要“路由”(而不是“重定向”),请执行以下步骤:

Htaccess规则在内部重新路由请求:

RewriteRule /profile?username=([^&]*) index.php/user/$1 [L]

Route.php:

<?php
$route['user/(:any)'] = 'user/index/$1';

控制器:

<?php
class User extends CI_Controller {
    public function index($username)
    {
        // ...
    }
}

如果这不起作用,那么,你正在做一个糟糕的工作来解释你的问题:)。

答案 1 :(得分:0)

问题很可能是?是正则表达式语言中的特殊字符,意思是1或0.您需要将其转义才能匹配,这样的事情可以解决您的问题: $route['user/(:any)'] = "profile\?username=$1";

答案 2 :(得分:0)

好的,你想要反过来做。尝试:

RewriteRule user/([^/?]+) index.php/profile?username=$1 [L]

对不起,如果这不起作用,我的Apache不合作。