我正在尝试将任何或一组子域重定向到CI安装的“controllers”文件夹中的文件夹。我已经尝试了一些在SO上找到的东西,但没有一个适用于我的项目或者我需要相同的规格。因为在谈到.htaccess时我有点像菜鸟所以我想我可能只会问一个更有资格的人。以下是规格:
示例:http:// api .domain.com / some / uri / segments 应在内部重定向到CI_installation_folder / application / controllers / api / some / URI /段
我尝试过这样的事情(以及各种变化):
RewriteCond %{HTTP_HOST} ^(www|admin|api) [NC]
RewriteRule ^(.*)$ /%1/$1 [L,R=301]
或用其他2行代替RewriteRule
:
RewriteCond %{ENV:REDIRECTED} !true
RewriteRule ^(.*)$ [L,R=301,E=REDIRECTED:true]
以防止循环,但我可以得到的是循环重定向(第一种情况)或甚至在某些变体上的500服务器错误:(
添加此
RewriteCond %{REQUEST_URI} !^/(www|admin|api) [NC]
也不起作用,因为我没有更改地址栏中的URL。我也没有[P]旗帜取得任何成功。
有人可以帮忙吗?谢谢!
答案 0 :(得分:4)
您是否尝试使用Codeigniter的路由配置?
您不必使用htaccess
重写 - 虽然它是一种有效的方法,但您只需检查config/route.php
文件中的子域并设置子域的路由。
switch ($_SERVER['HTTP_HOST']) {
case 'admin.domain.com':
$route['(:any)'] = "admin/$1"; // this will set any uri and add the controler fodler to it
$route['default_controller'] = "admin/home"; // set the default controller for this subdomain
break;
case 'api.domain.com':
$route['(:any)'] = "api/$1"; // this will set any uri and add the controler fodler to it
$route['default_controller'] = "api/home"; // set the default controller for this subdomain
break;
}
如果您希望它是更通用/动态的路由,您可以像这样(在同一个config/route.php
文件中):
$controllerFolderName = array_shift((explode(".",$_SERVER['HTTP_HOST'])));
$route['(:any)'] = $controllerFolderName."/$1";
$route['default_controller'] = $controllerFolderName."/home";
此路由适用于所有子域,并将默认路由设置为控制器文件夹内与子域名相同的文件夹,因此对于像api.domain.com这样的域,您将路由设置为api等
为所有文件夹名称保留相同的逻辑,以便它们始终与您的子域名匹配,这一点很重要。我还建议为没有子域名(http://domain.com)的访问者添加错误处理系统,以及你有子域,但是不存在具有该名称的文件夹(你可以用file_exits
来实现)
答案 1 :(得分:1)
经过几个小时的挖掘后,我想我解决了这个问题。这是如何(对于那些关心的人):
# Subdomains to Folders + Enforce www
RewriteCond %{HTTP_HOST} ^(www|admin|api) [NC]
RewriteRule ^(.*)$ http://www.localhost/%1/$1 [L,P,S=1]
RewriteRule ^(.*)$ http://www.localhost/$1 [L,R=301]
我将内部重定向与www enforcer规则结合起来。在配置Apache服务器以接受并正确重定向PROXY请求后,所有要做的事情:)
有phun!
答案 2 :(得分:0)
尝试了以上建议,但遇到了很多问题。找到了一种解决方案,该解决方案允许您将所有URI路由到基于子域的目录,同时允许您按预期使用codeigniter路由功能。
首先,将以下代码放在您的application / core文件夹中:
class MY_Router extends CI_Router {
public function __construct($routing=NULL) {
$routing['directory'] = explode('.',$_SERVER['HTTP_HOST'])[0];
parent::__construct($routing);
}
}
Codeigniter现在将在路由时将子域目录放在所有控制器之前。 (即... application / subdomain_dir / class / method)
接下来,在config.php文件中设置base_url。
$subdomain = explode('.',$_SERVER['HTTP_HOST'])[0];
$config['base_url'] = 'http://'.$subdomain.'.domain.com';
最后,按预期使用routes.php。
$route['default_controller'] = "home";
上面的默认控制器现在将被路由到 subdomain_dir / home。同样,如果导航到 subdomain .domain.com / class / method,您将被路由到 subdomain_dir / class / method。
希望这对以后的人有帮助。