重新路由后默认控制器未加载
我有一个 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/";
对于第二种情况,默认控制器可以完美加载。对于子网站情况,没有/
我只得到 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;
I have a codeigniter multistie install where I have such code that I can serve sites with such links
site.com/sites/sitename/controller/function/vars
site.com/controller/function/vars/
subdom.site.com/controller/function/vars
the challange is that , whith the routing
$route['sites/([^/]+)/(.*)'] = '$2';
$route['default_controller'] = "content";
I get working the links like
site.com/sites/sitename/controller/function/vars
site.com/controller/function/vars
By idea when I go to
www.site.com/sites/sitename/
the default controller is not loading.
I made the config.php so that regarding the link structure, when I visit link
site.com/sites/sitename/controller/function/vars
then
$config['base_url']="http://site.com/sites/sitename";
if I go to
site.com/controller/function/vars
then
$config['base_url']="http://site.com/";
for the second case the default controller loads perfectly. For the subsite case not/
I get just 404
What to do?
UPDATE 2:
I have a multifolder setup.
When user goes to www.site.com/sites/site_name
then a folder of application
/root_folder/usersites/site_name is loaded.
When user goes just site.com/controller/function/var1/var2
a default application folder which is
/root_folder/application is loaded
when user goes to sub1.site.com application folder
/root_folder/domains/sub1_site_com is loaded
So when I enter in address bar
http://site.com/sites/site_name
it should be like no URI. and should load default controller.
// 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;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您似乎正在做的是寻找具有您正在通过的“站点名称”的控制器。因此,如果您导航到
site.com/sites/my-site/
,您的路线会告诉它寻找名为 my-site 的控制器并运行 index 方法。路由的值应该是实际控制器/方法对的路径。
应该是
这是假设它是接受站点名称作为站点控制器中的第一个参数的索引方法。
What you appear to be doing is looking for a controller with the 'sitename' you are passing through. So if you navigate to
site.com/sites/my-site/
you route tells it to look for a controller called my-site and run the index method.The value of the route should be a path to an actual controller / method pair.
should be
This is assuming it's the index method that accepts the sitename as it's first parameter in your sites controller.
目前尚不完全清楚您要问什么,但这里有一个镜头:
您需要在网站的根目录中创建一个
.htaccess
文件(即在您的系统
同一文件夹中) code> 文件夹位于)。在该文件中:请参阅本页的“删除 index.php 文件”部分: http:// /codeigniter.com/user_guide/general/urls.html 了解更多信息。
此外,您使用的
route
将使您在访问www.site.com
时看到www.site.com/网站/内容
。对于 URL
www.site.com/sites/sitename/content/
,sites
是您的控制器,sitename
是方法或函数,< code>content 将被视为sitename
函数的参数 - 这不会像您想要的那样工作,但在没有看到您的控制器的情况下我无法确定。也许编辑您的问题并添加您的控制器,我们可以提供更多帮助。
更新:
1:
$config['base_url']
与路由或正在使用的控制器无关,因此这使您的问题更难理解。2:不清楚你想要实现什么(抱歉)。
根据 CI 用户指南:
因此,这意味着仅当不存在 URI 时才使用
default_controller
。换句话说:默认控制器仅在 URL 为 www.site.com 时适用,在其他情况下不会使用它(除非您使用控制器文件夹中的子文件夹 - 见下文)。如果您尝试使每个站点都有自己的控制器,则可以使用控制器文件夹中的子文件夹。
在routes.php中:
然后你的文件夹结构:
这样你就有了控制器文件夹。在其中,为每个站点创建一个文件夹。在每个控制器中创建默认控制器(上图中名为 content.php)。
通过此设置,
www.site.com/sites/site1
将从application/controllers/site1/content.php
调用默认控制器 (content
) code> 并显示该控制器的index
函数。如果您随后想要调用 site1 控制器的其他函数,则 URL 将如下所示:
www.site.com/sites/site1/content/otherFunction
。希望这有帮助。
It's not totally clear what you're asking, but heres a shot:
You need to create an
.htaccess
file in the root of your site (i.e. in the same folder that yoursystem
folder is in). In that file:See the "Remove the index.php file" section of this page: http://codeigniter.com/user_guide/general/urls.html for more info.
Also, the
route
that you're using would make it so that when you go towww.site.com
, you will seewww.site.com/sites/content
.With the url
www.site.com/sites/sitename/content/
,sites
is your controller,sitename
the method or function, andcontent
would be considered a parameter to thesitename
function -- this won't work like it seems like you want, but I can't be sure without seeing your controller.Maybe edit your question and add your controller(s), and we can be of more assistance.
UPDATE:
1:
$config['base_url']
has nothing to do with routing or which controller is being used, so this is making your question harder to understand.2: It isn't clear what you are trying to accomplish (sorry).
According to the CI user guide:
So, what this means is that the
default_controller
is used only when there is no URI present. In other words: the default controller only applies when the URL is www.site.com, and in no other case will it be used (unless you are using sub-folders in the controllers folder -- see below).If you trying to make it so that each of your sites has its' own controller, you could use subfolders in your controller folder.
In routes.php:
Then your folder structure:
So you have your controller folder. In it, create a folder for each site. In each of those controllers create your default controller (named content.php in the above image).
With this setup,
www.site.com/sites/site1
will call the default controller (content
) fromapplication/controllers/site1/content.php
and show theindex
function of that controller.If you then want to call other functions of the site1 controller, the URL would look like:
www.site.com/sites/site1/content/otherFunction
.Hope this helps.
这是解决方案。感谢所有回答的人。谢谢暴风雨。您在路由示例中向我指出了写入方向。谢谢
this was solution. thanks all who answered. thanks stormdrain. you pointed me to a write direction in your routing example. Thanks