Проблема:
В 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));
}
}
?>
Комментарии
Если url() , там есть передача через array('query' => '....') см. common.inc
Большое человеческое БЛАГОДАРЮ!
2 дня искал решение!
Только не подскажешь куда это нужно вписать?
Решение, видимо, не подходит для 6.22 - у меня путь сохраняется, но при попытке просмотра документа вылетает 404.
Может еще где что нужно поправить?
А у меня в 6.22 на главную кидает(
нафуя? стандарт жеж вроде
к сожалению надо...
ссылка из документа вида /kompaniya#com15 становится kompaniya%23com15 и "страница не найдена"
под 7мой никто решения не знает?
Под D7 есть решение?
Это не работает
Решение под 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']);
}?>
Обратите внимание, что админка работает с чистым знаком вопроса, т.е. если вы просто вставите регулярное выражение, то админка работать не будет.
Если есть замечания, поправьте. Ошибок пока не выявил, но они могут быть, так как сайт только тестирую.
не совсем то. я даже не очень понимаю ситуацию при которой, имея чистые урл, можно не преобразовать вопрос в юникод..