Маршрутизация поддоменов Codeigniter

Я пытаюсь настроить блог script на веб-сайте, работающем в рамках CodeIgniter. Я хочу сделать это без внесения каких-либо серьезных изменений кода в мой существующий код сайта. Я полагал, что создание поддомена, указывающего на другой контроллер, будет самым чистым способом этого.

Действия, которые я предпринял для настройки моего нового контроллера Blog, включали:

  • Создание записи A, указывающей на IP-адрес моего сервера.
  • Добавление новых правил в файл 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.mp и blog.notedu.mp/latest на мой контроллер Blog.

Теперь вот проблема...

Доступ к blog.notedu.mp или blog.notedu.mp/index.php/blog/latest отлично работает, однако доступ к blog.notedu.mp/latest по какой-то причине приводит меня к странице 404...

Мой .htaccess файл выглядит так (по умолчанию для удаления index.php из URL-адреса):

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";
    }

}

Что я пропустил или делаю неправильно здесь? Я искал решение этой проблемы в течение нескольких дней:(

Ответ 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]

Спасибо всем, кто прочитал или ответил на этот вопрос.

Ответ 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();
        }
    }

Надеюсь, что это поможет.

Ответ 3

$route['latest'] = "index";

означает, что URL http://blog.example.com/latest будет искать метод index() в контроллере index.

Вы хотите

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

В руководстве пользователя Codeigniter есть четкое объяснение маршрутов здесь

Ответ 4

есть "AllowOverride All" в файле конфигурации субдомена в apache?

без него "blog.notedu.mp/index.php/blog/latest" работает отлично, но "blog.notedu.mp/latest" no