Pull to refresh

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

Reading time2 min
Views6.6K
Известно, что по умолчанию в 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.
Tags:
Hubs:
+2
Comments4

Articles

Change theme settings