Маршрутизация без учета регистра в CodeIgniter - PullRequest
4 голосов
/ 17 ноября 2011

Я написал это в маршрутизаторах CodeIgniter.

$route['companyname'] = "/profile/1";

Это работает нормально, но когда я набираю "CompanyName" в URL, это не работает. Это потому, что заглавные буквы.

Я хочу сделать этот маршрут без учета регистра. Пожалуйста, предложите лучший способ.

Ответы [ 8 ]

16 голосов
/ 26 октября 2013

Просто добавьте выражение " (? I) "
Вот пример:
$route['(?i)companyname'] = "/profile/1";

3 голосов
/ 26 ноября 2013

Если вы хотите маршрутизацию без учета регистра для всех маршрутов, вам просто нужно расширить класс CI_Router, а затем изменить метод _parse_routes () следующим образом:

public function _parse_routes()
{
    foreach ($this->uri->segments as &$segment)
    {
        $segment = strtolower($segment);
    }

    return parent::_parse_routes();
}

Это будет чище, чем редактирование самого класса CI_URI. :)

1 голос
/ 12 ноября 2015

IN Directory system / core / uri.php

поиск около

$ this -> _ parse_request_uri ()

вы найдете 2, замените их на

strtolower ($ this -> _ parse_request_uri ())

1 голос
/ 15 июля 2013

Использовать хуки:

Создать приложение / хуки / LowerUrl.php

class LowerUrl {
    public function run() {
            $_SERVER['REQUEST_URI'] = strtolower($_SERVER['REQUEST_URI']);
    }
}

Добавить в приложение / config / hooks.php

$hook['pre_system'] = array(
    'class'    => 'LowerUrl',
    'function' => 'run',
    'filename' => 'LowerUrl.php',
    'filepath' => 'hooks'
);
0 голосов
/ 02 июня 2015

Использовать маршрутизатор:

$urix = substr(strtolower($_SERVER['REQUEST_URI']), 1);

$route["(?i)$urix"] = $urix;

Решение для всех маршрутизации без учета регистра ..

0 голосов
/ 17 ноября 2011

Самый простой способ, который я мог бы придумать, - это использовать URL-адреса в нижнем регистре с помощью mod_rewrite (если вы используете apache ...)

RewriteMap  lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]

Источник: http://www.chrisabernethy.com/force-lower-case-urls-with-mod_rewrite/

0 голосов
/ 17 ноября 2011

Может быть, вы можете использовать strtolower в вашей функции _remap . Не уверен, что это работает, это была просто идея;)

0 голосов
/ 17 ноября 2011

Хм, ну, грязный, но прямой способ состоит в том, чтобы сделать небольшой хак в основной класс Uri. Откройте файл uri.php внутри system/core/, выделите строку 269, где у вас есть метод _explode_segments(), и сделайте их строчными. Плохой метод, но должен работать.

function _explode_segments()
{
    foreach (explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
    {
        // Filter segments for security
        $val = trim($this->_filter_uri($val));

        if ($val != '')
        {
                    // $this->segments[] = $val;  // <--- ORIGINAL
            $this->segments[] = strtolower($val);   // <--- CHANGED
        }
    }
}  

Просто учтите, что если вы обновите свою установку, эти изменения будут перезаписаны, но в любом случае они настолько малы. В качестве альтернативы, вы можете пойти на хук pre_system, но я думаю, что это будет гораздо сложнее

Кроме того, в маршрутах не следует использовать начальную или конечную косую черту, поэтому она должна быть

$route['companyname'] = "profile/1";
...