Может ли htaccess переопределить CodeIgniter routes.php

#.htaccess #codeigniter #routing #url-routing #url-masking

#.htaccess #codeigniter #маршруты #url-маршрутизация #маскирование URL

Вопрос:

Мне интересно, возможно ли переопределить routes.php правила с htaccess в Codeigniter 3.

Например, чтобы указать динамические поддомены на те же контроллеры и передать поддомен в качестве параметра, routes.php не подходит для этого, в то время как в htaccess это действительно просто сделать.

Другим примером является маскировка строк запроса сегментами URL. Routes.php не позволяет использовать строки запроса, но htaccess, опять же, идеально подходит для этого.

Итак, в качестве общего вопроса, возможно ли использовать htaccess для всей маршрутизации в CodeIgniter вместо использования routes.php ?

Ответ №1:

Я думаю, вы можете использовать htaccess для статической маршрутизации в codeigniter. Но для базы приложений динамической маршрутизации, такой какhttp://localhost/myproject/user/1 вы должны использовать routes.php .

Ответ №2:

Конфигурация маршрутов Codeigniter используется для маршрутизации шаблонов модулей / контроллеров / методов / переменных.

Я думаю, домен / поддомены выходят из этой конфигурации, однако вы могли бы использовать динамический base_url, основанный на переменных $ _SERVER, а затем получить строку (поддомен) от конкретного контроллера.

Из моей конфигурации на CI 2.x

 $config['base_url'] = isset($_SERVER['HTTPS']) amp;amp; strtolower($_SERVER['HTTPS']) == 'on' ? 'https' : 'http';
$config['base_url'] .= '://'. $_SERVER['HTTP_HOST'];
$config['base_url'] .= isset($_SERVER['SERVER_PORT']) amp;amp; $_SERVER['SERVER_PORT'] != '80' amp;amp; $_SERVER['SERVER_PORT'] != '443' ? ( ':'.$_SERVER['SERVER_PORT'] ) : '';
$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
  

затем сделайте что-то вроде этого…

 $server = $_SERVER['HTTP_HOST'];
$domain = preg_replace('#^www.(. .)#i', '$1', $server);
$domain = $this->extract_domain($domain);
$subdomain = $this->extract_subdomains($server);

function extract_domain($domain)
{
    if(preg_match("/(?P<domain>[a-z0-9][a-z0-9-]{1,63}.[a-z.]{2,6})$/i", $domain, $matches))
    {
        return $matches['domain'];
    } else {
        return $domain;
    }
}

function extract_subdomains($domain)
{
    $subdomains = $domain;
    $domain = $this->extract_domain($subdomains);

    $subdomains = rtrim(strstr($subdomains, $domain, true), '.');

    return $subdomains;
}