2

我需要改变

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
4

3 回答 3

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
    }
}

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


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

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

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

路由.php:

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

控制器:

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

如果这不起作用,那么,那么,你在解释你的问题时做得很糟糕:)。

于 2012-04-09T16:23:04.347 回答
0

问题很可能是?正则表达式语言中的一个特殊字符,表示 1 或 0。您需要对其进行转义以使其匹配,这样的事情应该可以解决您的问题: $route['user/(:any)'] = "profile\?username=$1";

于 2012-04-09T13:48:10.437 回答
0

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

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

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

于 2012-04-09T14:53:12.020 回答