Замена в url символов '%2F', '%3F', '%3D', '%26', '%2523' на '/', '?', '=', '&', '#'

Аватар пользователя Dimm Dimm 18 ноября 2008 в 20:50

Проблема:
В url символы '/', '?', '=', '&', '#' заменяются кодами '%2F', '%3F', '%3D', '%26', '%2523' (если включены чистые ссылки).
Решение нашел здесь: http://drupal.org/node/150898


<?php
function drupal_urlencode($text) {
  if (
variable_get('clean_url''0')) {
  
// return str_replace(array('%2F', '%26', '%23', '//'),
  //                    array('/', '%2526', '%2523', '/%252F'),
  //                    rawurlencode($text));
  
return str_replace(array('%2F''%3F''%3D''%26''%2523'),
                     array(
'/''?''=''&''#'),
                     
rawurlencode($text));
  }
  else {
    return 
str_replace('%2F''/'rawurlencode($text));
  }
}
?>

Комментарии

Аватар пользователя krussAnt krussAnt 3 февраля 2010 в 13:05

Большое человеческое БЛАГОДАРЮ!
2 дня искал решение!
Только не подскажешь куда это нужно вписать?

Аватар пользователя Айдар Айдар 14 сентября 2011 в 21:45

Решение, видимо, не подходит для 6.22 - у меня путь сохраняется, но при попытке просмотра документа вылетает 404.

Может еще где что нужно поправить?

Аватар пользователя alias612 alias612 29 января 2012 в 19:18

к сожалению надо...
ссылка из документа вида /kompaniya#com15 становится kompaniya%23com15 и "страница не найдена"
под 7мой никто решения не знает?

Аватар пользователя baklaev baklaev 24 мая 2014 в 14:04

Решение под drupal 7
Долго разбирал код и пришел к следующим выводам:
1. Без правки кода работоспособны только такие ссылки
http://mysite.ru/index.php%3Fpage=4&id=178
т.е. в юрл понимаются все символы, кроме вопроса. При постановке знака ? страница будет не найдена.
2. Без правки ядра не обойтись. hook_url_inbound_alter не работает, как не мучай его, так как он работает с чистыми юрл (насколько я понял). Это значит, порядок такой:
а) получаем юрл из адресной строки браузера;
б) если он не чистый (не node/2 например, а index.php%3Fpage=4&id=178), ищем соответствие в таблице адресов в БД;
в) находим соответствие, заменяем ваш синоним адреса на чистый
г) обрабатываем его функцией hook_url_inbound_alter.
Таким образом функция не может поменять знаки в синонимах юрл, так как не получает их вообще.
3. Путь из юрл содержится в переменной $_GET['q'], которая в свою очередь получает его из $_SERVER['REQUEST_URI']. Таким образом надо применить регулярное выражение к $_SERVER['REQUEST_URI'] и заменить знак ? на %3F.

Ищем function request_path() в bootstrap.inc и добавляем после \

<?php
elseif (isset($_SERVER['REQUEST_URI'])) {
 
// This request is either a clean URL, or 'index.php', or nonsense.
    // Extract the path from REQUEST_URI.
    
if (!preg_match("/admin/i"$_SERVER['REQUEST_URI'])){
        
$_SERVER['REQUEST_URI']=preg_replace ("/\?/""%3F",$_SERVER['REQUEST_URI']);
    }
?>

Обратите внимание, что админка работает с чистым знаком вопроса, т.е. если вы просто вставите регулярное выражение, то админка работать не будет.

Если есть замечания, поправьте. Ошибок пока не выявил, но они могут быть, так как сайт только тестирую.

Аватар пользователя vortex vortex 26 мая 2014 в 11:38

не совсем то. я даже не очень понимаю ситуацию при которой, имея чистые урл, можно не преобразовать вопрос в юникод..