【问题标题】:Default Controller not loading after rerouting重新路由后默认控制器未加载
【发布时间】:2010-07-27 18:47:55
【问题描述】:

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

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

然后

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

对于第二种情况,默认控制器可以完美加载。对于子站点情况 not/

我只得到 404

怎么办?

更新 2:

我有一个多文件夹设置。

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

然后是应用程序的文件夹

/root_folder/usersites/site_name 已加载。

当用户只去 site.com/controller/function/var1/var2

一个默认的应用程序文件夹

/root_folder/应用程序已加载

当用户转到 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;

【问题讨论】:

    标签: codeigniter codeigniter-url


    【解决方案1】:

    您似乎正在寻找一个带有您正在通过的“站点名称”的控制器。因此,如果您导航到 site.com/sites/my-site/,您的 route 会告诉它寻找一个名为 my-site 的控制器并运行 index 方法。

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

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

    应该是

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

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

    【讨论】:

    • 此路由不起作用,因为我的应用程序文件夹中没有任何 sites.php 控制器
    【解决方案2】:

    不完全清楚你在问什么,但这里有一个镜头:

    您需要在您网站的根目录中创建一个.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

    使用 URL 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。至 指定默认控制器,打开 你的应用程序/config/routes.php 文件并设置此变量:

    所以,这意味着default_controller 仅在不存在URI 时使用。换句话说:默认控制器仅在 URL 为 www.site.com 时适用,在其他任何情况下都不会使用(除非您使用控制器文件夹中的子文件夹 -- 见下文)。

    如果您尝试让每个站点都有自己的控制器,您可以使用控制器文件夹中的子文件夹。

    在 routes.php 中:

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

    然后你的文件夹结构:

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

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

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

    希望这会有所帮助。

    【讨论】:

    • stromdrain 感谢您的回答,但我知道如何删除 index.php 并建立良好的链接。我已经编辑了这个问题。现在更清楚了吗?
    • @DR.GEWA :请参阅我上面答案的“更新”部分。
    • 没有。因为我有路由问题,而不是加载应用程序文件夹。我只需要路由 2 个规则。 1. 如果是 www.multi.com/sites/siteX/ 之类的 url ->>>>>> /content/index/ 2. 如果是 url www.multi.com/sites/siteX/controller 或 www.multi .com/sites/siteX/controller/method ->>>>controller/method/ 也传递变量。
    【解决方案3】:
    $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';
                            }
    

    这是解决方案。感谢所有回答的人。谢谢暴风雨。您在路由示例中向我指出了写入方向。谢谢

    【讨论】:

      猜你喜欢
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多