2013-10-10 3 views
14

Когда я пытаюсь перенаправить на другой веб-сайт, я получаю эту ошибку:Codeigniter Redirect - URI, который Вы представили, запрещенные символы

PHP-обнаружена ошибка

Серьезность: Предупреждение

Сообщение: parse_url (/% 22 * ​​*) [function.parse-URL]: Невозможно разобрать URL-адрес

Имя файла: ядро ​​/ URI.php

Номер

Line: 219


Обнаружена ошибка

URI, который Вы представили, недопустимые символы.


Это весь код, я имею в URI.php

private function _detect_uri() 
{ 
    if (! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME'])) 
    { 
     return ''; 
    } 

    $uri = $_SERVER['REQUEST_URI']; 
    if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) 
    { 
     $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); 
    } 
    elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) 
    { 
     $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); 
    } 

    // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct 
    // URI is found, and also fixes the QUERY_STRING server var and $_GET array. 
    if (strncmp($uri, '?/', 2) === 0) 
    { 
     $uri = substr($uri, 2); 
    } 
    $parts = preg_split('#\?#i', $uri, 2); 
    $uri = $parts[0]; 
    if (isset($parts[1])) 
    { 
     $_SERVER['QUERY_STRING'] = $parts[1]; 
     parse_str($_SERVER['QUERY_STRING'], $_GET); 
    } 
    else 
    { 
     $_SERVER['QUERY_STRING'] = ''; 
     $_GET = array(); 
    } 

    if ($uri == '/' || empty($uri)) 
    { 
     return '/'; 
    } 

    $uri = parse_url($uri, PHP_URL_PATH); 

    // Do some final cleaning of the URI and return it 
    return str_replace(array('//', '../'), '/', trim($uri, '/')); 
} 
+0

именно то, что он говорит - пытались ли вы найти это сообщение об ошибке в исходном коде CI и следовать его пути к регулярному выражению, которое проверяет эти символы? Я уверен, что изменение этого регулярного выражения решит проблему ... –

ответ

46

CodeIgniter проверяет все сегменты URI для запрещенных символов. Это происходит с помощью белых листинговых символов. Какие из них разрешены, можно проверить в /system/application/config/config.php в переменной $config['permitted_uri_chars']. permitted_uri_chars - это символы, которые CodeIgniter принимает в вашем URI. Значение по умолчанию установлено на что-то вроде.

$config['permitted_uri_chars'] = 'a-z 0-9~%.:&_\-'; 

По умолчанию только они допускаются: a-z 0-9~%.:_-

Оставьте пустым, чтобы все символы - но только если вы сошли с ума.

%22 подходит для ". Вы можете добавить это в список permitted_uri_chars.

+1

Можно ли установить это на основе каждого метода? Смысл, я хочу разрешить @ для людей, отправляющих адрес электронной почты, но только в одном методе класса. Я хочу, чтобы он был запрещен везде, без необходимости проверять его в каждом случае. – KCL

3

Попробуйте это может помочь, но not recommended, в вашем application/config/config.php изменения:

$config['permitted_uri_chars'] = ''; #keep it blank to allow all characters 
$config['allow_get_array']  = TRUE; 
$config['enable_query_strings'] = TRUE; 
+2

Это не должно быть даже вариантом, и я думаю, что это было бы плохое образование для кого-то нового для php или кто не понимает безопасность. – Metropolis

+0

приятно, что это работа для меня, спасибо –

0

Выше решения идеально, кроме второго ряда ($config['allow_get_array'] = TRUE;); его не существует. Кстати, я использую систему блогов Open-Blog.info, и я столкнулся с этой проблемой при попытке открыть страницу администратора.

Смежные вопросы