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


CodeIgniter - redirect subdomains set to folder in "controllers"

我正在尝试使任何或一组子域重定向到 CI 安装的"控制器"文件夹中的文件夹。我已经尝试了在SO上找到的一堆东西,但没有一个适用于我的项目或具有我需要的相同规格。由于我在 .htaccess 方面有点菜鸟,所以我想我可能会在这里问一个更有资格的人。以下是规格:

  • 使用这个很棒的.htaccess文件作为基础
  • 需要至少将这三个子域 (www|admin|api) 重定向到/application/controllers/(www|admin|api) 等效文件夹
  • 不丢REQUEST_URI(只是说)
  • 并且无需实际更改地址栏中的URL

示例:http://api.domain.com/some/uri/segments应在内部重定向到CI_installation_folder/application/controllers/api/some/uri/segments

我尝试过这样的东西(和变体):

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] 标志上也没有取得任何成功。

谁能帮忙?谢谢!

您是否尝试使用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执行此操作)

经过几个小时的挖掘,我想我解决了问题。以下是方法(对于那些关心的人):

# 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 执行器规则相结合。在此之后,所有要做的就是将Apache服务器配置为接受并正确重定向PROXY请求:)

有呸!

尝试了上面的建议,但遇到了很多问题。找到了一个解决方案,允许您根据子域将所有 URI 路由到目录,同时允许您按预期使用代码点火器路由功能。

首先,将以下代码放在您的应用程序/核心文件夹中:

class MY_Router extends CI_Router {
    public function __construct($routing=NULL) {
        $routing['directory'] = explode('.',$_SERVER['HTTP_HOST'])[0];
        parent::__construct($routing); 
    }
}

Codeigniter 现在会在路由时将子域目录放在所有控制器之前。(即...应用程序/subdomain_dir/类/方法)

接下来,在 config.php 文件中设置您的base_url。

$subdomain = explode('.',$_SERVER['HTTP_HOST'])[0];
$config['base_url'] = 'http://'.$subdomain.'.domain.com';

最后,按预期使用路线.php。

$route['default_controller'] = "home";

上面的默认控制器现在将路由到subdomain_dir/主。同样,如果您导航到子域.domain.com/class/method,您将被路由到subdomain_dir/类/方法。

希望这对将来的某人有所帮助。