Решение проблемы с русскими символами в URL

    Известно, что по умолчанию в Code Igniter русские буквы в адресах запрещены.
    Однако даже при изменении в файле system/application/config/config.php строки
    $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
    на
    $config['permitted_uri_chars'] = 'a-zа-яё 0-9~%.:_\-';
    проблема не решилась.
    Пришлось заглянуть в файл system/libraries/URI.php, который отвечает за обработку адресов. Принятием решения о корректности сегмента URL занимается эта строка (метод _filter_uri):
    1. if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
    2. { ... }
    * This source code was highlighted with Source Code Highlighter.

    После получаса гугления стало ясно, что чтобы заставить preg_match воспринимать юникодные символы, нужно добавить к регулярному выражению модификатор 'u'. После этого все заработало.

    Публикую этот способ решения проблемы, и интересуюсь у читателей блога: есть ли какой-то способ обойти эту проблему без модификации класса из ядра фреймворка?

    UPD:
    пока публиковал, до меня дошло, что можно не изменять системный класс, а расширить его, перегрузив метод _filter_uri. Для этого создаем файл system/application/libraries/MY_URI.php и размещаем там следующий код:
    1. <?php
    2.  
    3. class MY_URI extends CI_URI
    4. {
    5.     function _filter_uri($str)
    6.     {
    7.         if ($str != '' AND $this->config->item('permitted_uri_chars') != '')
    8.         {
    9.             if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|ui", $str))
    10.             {
    11.                 exit('The URI you submitted has disallowed characters.');
    12.             }
    13.         }
    14.             
    15.         return $str;
    16.     }
    17. }
    * This source code was highlighted with Source Code Highlighter.
    Поделиться публикацией

    Комментарии 4

      +1
      Наверное, можно «перегрузить» класс, но зачем? Это же не полное переписывание метода. Как по мне, отличное решение.
        0
        да, главное не забывать при обновлении изменить файл.
          0
          Думаю, после первого «disallowed characters in url» все прекрасно вспоминается.
        0
        спасибо, помогло — плюс в карму

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое