Codeigniter 子域路由

Posted

技术标签:

【中文标题】Codeigniter 子域路由【英文标题】:Codeigniter subdomain routing 【发布时间】:2014-02-26 00:40:51 【问题描述】:

我正在尝试在 CodeIgniter 框架上运行的网站上设置博客脚本。我想在不对现有网站代码进行任何重大代码更改的情况下执行此操作。我认为创建一个指向另一个控制器的子域将是最干净的方法。

我设置新的Blog 控制器所涉及的步骤:

    创建指向我的服务器 IP 地址的 A 记录。 向 CodeIgniter 的 routes.php 文件添加新规则。

这是我想出的:

switch ($_SERVER['HTTP_HOST']) 
    case 'blog.notedu.mp':
        $route['default_controller'] = "blog"; 
        $route['latest'] = "blog/latest";
        break;
    default:
        $route['default_controller'] = "main";
        break;

这应该将blog.notedu.mpblog.notedu.mp/latest 指向我的blog 控制器。

现在问题来了……

访问blog.notedu.mpblog.notedu.mp/index.php/blog/latest 工作正常,但是访问blog.notedu.mp/latest 会因为某种原因将我带到404 页面...

我的 .htaccess 文件如下所示(从 url 中删除 index.php 的默认设置):

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

而我的Blog 控制器包含以下代码:

class Blog extends CI_Controller 

    public function _remap($method)
        echo "_remap function called.\n";
        echo "The method called was: ".$method;
    

    public function index()
    
        $this->load->helper('url');
        $this->load->helper('../../global/helpers/base');

        $this->load->view('blog');
    

    public function latest()
        echo "latest working";
    


我在这里错过了什么或做错了什么?这几天我一直在寻找解决这个问题的方法:(

【问题讨论】:

你有htaccess来删除index.php吗? 我愿意。这应该有所作为吗? 如果有帮助,请使用我的 htaccess 文件编辑 OP。 仍然无法让这个工作,所以开始赏金。你 CodeIgniter 大师应该能够在这里轻松获得 +50 ;) 【参考方案1】:

经过 4 天的反复试验,我终于解决了这个问题!

原来这是一个 .htaccess 问题,以下规则修复了它:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

感谢所有阅读或回答此问题的人。

【讨论】:

我有一个问题要问您 - noteedu.mp/blog 和 notedu.mp/blog/latest 是否也显示您的博客?【参考方案2】:

blog.domain.co/blog/latest 是否也显示 404? 也许您还可以查看默认控制器的 _remap() 函数。 http://ellislab.com/codeigniter/user-guide/general/controllers.html#default

基本上,CodeIgniter 使用 URI 的第二段来确定控制器中的哪个函数被调用。您可以通过使用 _remap() 函数来覆盖此行为。

直接来自用户指南,

如果你的控制器包含一个名为 _remap() 的函数,它总是 无论您的 URI 包含什么内容,都会被调用。它覆盖 URI 确定调用哪个函数的正常行为, 允许您定义自己的函数路由规则。

public function _remap($method)
    
        if ($method == 'some_method')
        
            $this->$method();
        
        else
        
            $this->default_method();
        
    

希望这会有所帮助。

【讨论】:

感谢您的回答,但我仍然遇到同样的问题。 blog.notedu.mp 成功触发函数,但blog.notedu.mp/latest 抛出 apache 404 页面(不是 CodeIgniter 页面)。有什么想法吗?【参考方案3】:

在apache子域的配置文件中有“AllowOverride All”?

没有它“blog.notedu.mp/index.php/blog/latest”可以完美运行,但是“blog.notedu.mp/latest”没有

【讨论】:

感谢您的回答。我在为我的域启用站点的文件中有以下规则,但仍然是 404。# Give .htaccess 完全覆盖权限 AllowOverride AuthConfig FileInfo Indexes Limit Options=All,MultiViews 【参考方案4】:
$route['latest'] = "index";

表示 URL http://blog.example.com/latest 将在 index 控制器中查找 index() 方法。

你想要的

$route['latest'] = "blog/latest"; 

Codeigniter 用户指南对路线有明确的解释here

【讨论】:

感谢您的回答。这实际上是我的路线 - 自上次编辑以来,我忘记更新这部分代码。我添加了 $route['(:any)'] = "blog/latest";也作为测试,但我仍然得到 404。有什么想法吗? 您能否回显$_SERVER['HTTP_HOST'] 以验证它是否符合您的预期(blog.notedu.mp)?另外,你能检查一下error_log和access_log吗?

以上是关于Codeigniter 子域路由的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MAMP Pro 在 Codeigniter 3 中创建动态子域

.htaccess 问题、虚拟子域和 Codeigniter

如何使用 .htaccess 在 codeigniter 中实现动态子域?

CodeIgniter 3 会话在页面刷新后销毁

将 Codeigniter 项目从主域复制到子域

重复的 SQL 导致 JOIN - Codeigniter