CodeIgniter - 重定向子域设置为“控制器”中的文件夹

时间:2015-01-25 18:25:16

标签: php apache .htaccess codeigniter mod-rewrite

我正在尝试将任何或一组子域重定向到CI安装的“controllers”文件夹中的文件夹。我已经尝试了一些在SO上找到的东西,但没有一个适用于我的项目或者我需要相同的规格。因为在谈到.htaccess时我有点像菜鸟所以我想我可能只会问一个更有资格的人。以下是规格:

  • 使用this awesome .htaccess file作为基础
  • 需要将至少这三个子域名(www | admin | api)重定向到/ application / controllers /(www | admin | api)等效文件夹
  • 没有丢失REQUEST_URI(只是说)
  • 并且实际上没有更改地址栏中的网址

示例: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]旗帜取得任何成功。

有人可以帮忙吗?谢谢!

3 个答案:

答案 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。

希望这对以后的人有帮助。