重新路由后默认控制器未加载

时间:2010-07-27 18:47:56

标签: codeigniter codeigniter-url

我有一个codeigniter多站点安装,我有这样的代码,我可以用这样的链接提供网站

site.com/sites/sitename/controller/function/vars site.com/controller/function/vars /

subdom.site.com/controller/function/vars

挑战是,路由

$route['sites/([^/]+)/(.*)'] = '$2';
$route['default_controller'] = "content";

我开始使用像

这样的链接

site.com/sites/sitename/controller/function/vars site.com/controller/function/vars

当我去

时的想法

www.site.com/sites/sitename/

默认控制器未加载。

我制作了config.php,以便关于链接结构,当我访问链接

site.com/sites/sitename/controller/function/vars

然后

$config['base_url']="http://site.com/sites/sitename";

如果我去

site.com/controller/function/vars

然后

$配置[ 'BASE_URL'] = “http://site.com/”;

对于第二种情况,默认控制器完全加载。对于子网站的情况不是/

我只得到404

怎么办?

更新2:

我有一个多文件夹设置。

当用户访问www.site.com/sites/site_name

然后是应用程序的文件夹

/ root_folder / usersites / site_name已加载。

当用户访问site.com/controller/function/var1/var2

默认的应用程序文件夹

/ root_folder / application已加载

当用户转到sub1.site.com应用程序文件夹

时 已加载

/ root_folder / domains / sub1_site_com

所以当我进入地址栏时

http://site.com/sites/site_name

它应该没有URI。并应加载默认控制器。

    // Application folder loading code
$myApp = '';


if($_SERVER['SERVER_ADDR']=='127.0.0.1'){
    $main_url='site.com';
}
else{
    $main_url='site1.com';
}

//echo $main_url;

switch($_SERVER['HTTP_HOST'])
{
    case $main_url;




        $uri_string=$_SERVER['REQUEST_URI'];
                    $link_way=explode('/',$uri_string);

        if(strlen($uri_string)>6 and $link_way[1]=='sites' ){



            //print_r($link_way);
            //var_dump($link_way);

            //checking if the link goes to usersites and sitename is bigger and =5
            if($link_way[1]=='sites' and strlen($link_way[2])>=5){


                $myApp='sites/usersites/'.$link_way[2];
                define('SITE_ALIAS','1|'.$link_way[2]);


                }
            elseif($link_way[1]=='sites' and strlen($link_way[2])<5){
                exit('Username should be more than 4 chars');

                }






            }

        else{

                        define('SITE_ALIAS','0|'.str_replace('.','_',$_SERVER['HTTP_HOST']));


        $myApp = 'application';
                }




        break;

     default:
        $myApp = str_replace('.','_',$_SERVER['HTTP_HOST']);
        $myApp=str_replace('www_','',$myApp);
                 define('SITE_ALIAS','2|'.$myApp);
        $myApp='sites/domains/'.$myApp;



    }

$application_folder = $myApp;

3 个答案:

答案 0 :(得分:1)

你所要求的并不完全清楚,但是还有一个镜头:

您需要在站点的根目录中创建.htaccess文件(即在system文件夹所在的文件夹中)。在该文件中:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

请参阅本页的“删除index.php文件”部分:http://codeigniter.com/user_guide/general/urls.html了解更多信息。

另外,您使用的route会使您在转到www.site.com时看到www.site.com/sites/content

使用网址www.site.com/sites/sitename/content/sites是您的控制器,sitename方法或功能,content将被视为sitename功能的参数 - 这不会像你想要的那样工作,但我不能确定没有看到你的控制器。

也许编辑你的问题并添加你的控制器,我们可以提供更多帮助。


更新:

1:$config['base_url']与路由无关或使用哪个控制器,因此这使您的问题更难理解。

2:目前尚不清楚你想要完成什么(抱歉)。

  

当我去

时的想法      

www.site.com/sites/sitename /

     

默认控制器未加载。

根据CI user guide

  

可以告诉CodeIgniter加载一个   当URI不是时,默认控制器   现在,就像只有这样的情况   您的站点根URL是请求的。至   指定一个默认控制器,打开   你的application / config / routes.php   文件并设置此变量:

因此,这意味着当没有URI存在时,default_controller仅使用 。换句话说:默认控制器仅在URL为www.site.com时适用,并且在任何其他情况下都不会使用(除非您在控制器文件夹中使用子文件夹 - 请参阅下文)。

如果您尝试将其设置为每个站点都有自己的控制器,则可以在控制器文件夹中使用子文件夹。

在routes.php中:

$route['sites/(:any)'] = "$1";
$route['default_controller'] = "content";

然后你的文件夹结构:

所以你有你的控制器文件夹。在其中,为每个站点创建一个文件夹。在每个控制器中创建默认控制器(在上图中命名为content.php)。

通过此设置,www.site.com/sites/site1将从content调用默认控制器(application/controllers/site1/content.php),并显示该控制器的index功能。

如果您想要调用site1控制器的其他功能,则URL将如下所示: www.site.com/sites/site1/content/otherFunction

希望这有帮助。

答案 1 :(得分:1)

你似乎正在做的是寻找一个你正在经历的'sitename'的控制器。因此,如果您导航到site.com/sites/my-site/,您的路由会告诉它寻找名为my-site的控制器并运行索引方法。

路由的值应该是实际控制器/方法对的路径。

$route['sites/([^/]+)/(.*)'] = '$2';

应该是

$route['sites/([^/]+)/(.*)'] = 'sites/index/$1/$2';

这假设它是索引方法,它接受网站名称作为网站控制器中的第一个参数。

答案 2 :(得分:0)

$uri_string=$_SERVER['REQUEST_URI'];
                    $way=explode('/',$uri_string);


                       /// print_r($way);

//echo $way[3];
                        if($way[1]=="sites" and strlen($way[2])>2 and strlen($way[3])<1){


                            echo "JAJA ";


$route['sites/:any'] = "content/show_page/home";
                        }
                        else{



                           $route['sites/([^/]+)/(.*)'] = '$2';
                        }
这是解决方案。谢谢所有回答的人。谢谢stormdrain。你指出了你的路由示例中的写入方向。感谢