【问题标题】:CodeIgniter - redirect subdomains set to folder in "controllers"CodeIgniter - 将子域重定向到“控制器”中的文件夹
【发布时间】:2015-03-24 06:14:08
【问题描述】:

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

  • 使用this awesome .htaccess file 作为基础
  • 需要将至少这三个子域 (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]

或将RewriteRule 替换为其他 2 行,如下所示:

RewriteCond %{ENV:REDIRECTED} !true
RewriteRule ^(.*)$ [L,R=301,E=REDIRECTED:true]

为了防止循环,但我能得到的只是循环重定向(第一种情况),甚至在某些变体上出现 500 服务器错误:(

添加这个

RewriteCond %{REQUEST_URI} !^/(www|admin|api) [NC]

也不会工作,因为我没有更改地址栏中的 URL。我的 [P] 标志也没有任何成功。

有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: php apache .htaccess codeigniter mod-rewrite


    【解决方案1】:

    您是否尝试过使用 Codeigniter 的路由配置?

    您不必使用htaccess rewrite - 尽管它是一种有效的方法,但您只需检查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 执行此操作)

    【讨论】:

    • 感谢您的快速响应,但我的想法是尽可能降低水平。而且,如果您还考虑到我不是一般的“让它工作”的人,您会意识到这对我来说不是一个有效的解决方案:|。我想要一些动态且易于维护的东西,而不必重复规则、路线和其他东西。
    • 所以,你希望生活变得轻松......这是一个非常好的方法......让我更新我的回复
    • 这种方法更简洁 :) 而且我可能有点太挑剔了,但是当我说我想在尽可能低的级别上执行此操作时,我实际上是在表达我希望解决这个问题使用 .htaccess 重定向解决 因为在我的情况下性能很重要:)
    【解决方案2】:

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

    # 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 服务器以接受并正确重定向代理请求:)

    吃饱了!

    【讨论】:

      【解决方案3】:

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

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

      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。

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

      【讨论】:

        猜你喜欢
        • 2020-08-21
        • 2018-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多