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