Русские буквы в url

Для тех кто не любит нудных объяснений 🙂

Введите строку в одно из полей и нажмите соответствующую кнопку

Строка в закодированном виде

Строка в нормальном виде

Для тех кто любит "во всем разобраться" 😉

Кодирование URL и просто двоичных данных в последовательность букв, цифр и некоторых специальных знаков латинского алфавита в интернете было связано с ограничением физических устройств на передачу только алфавитно-цифровых символов. В URL такое кодирование обычно применяется для передачи символов в формате Unicode (как правило UTF-8) в последовательность из двух байт, записанных в шестнадцатиричном представлении. Каждый байт предваряется знаком %. При таком кодировании строчка "корова" будет иметь вид: %D0%BA%D0%BE%D1%80%D0%BE%D0%B2%D0%B0 . То есть русской букве к будет соответствовать последовательность %D0%BA и.т.д. Такое кодирование является общепринятым для путей к файлам или папкам, входящим в URL.

Подмножесто символов, которые разрешены в URL немного шире чем алфавитно-цифровые символы, так, в URL можно использовать дефис и подчеркивание, но нельзя, например, использовать одинарные или двойные кавычки. Некоторые символы используют для разделения параметров в URL, и их кодирование в этом случае будет неправомочным. В зависимости от отношения к кодированию специальных символов в javascript различают функции encodeURI и decodeURI, которые могут работать с полным URL, и, функции encodeURIComponent / decodeURIComponent, применяемые для параметров, входящих в URL.

Вообще говоря, кодирование параметров может быть достаточно произвольным. Здесь разработчик может использовать любую схему кодировки, если состав ее символов будет коректно передаваться через сеть. Так, вместо строки кириллицы в utf-8 можно применить строку в кодировке Windows 1251. В этом случае слово "корова" будет выглядеть как %EA%EE%F0%EE%E2%E0. То есть, символу к будет соответствовать последовательность из двух букв со знаком процента перед ними — %EA. Закодировать в строки с процентами кириллицу из других кодировок можно в нашем HTML кодировщике. В принципе, допустимы также другие способы кодирования, например, escape/unescape функцию javascript. Слово "корова" в этом случае будет выглядеть как %u043A%u043E%u0440%u043E%u0432%u0430 .

При работе с сайтом с кириллическими (русскими) адресами страниц (URL) действительно есть ряд нюансов. Давайте остановимся на них.

ЧПУ: латиница или кириллица?

Как показывают проведенные эксперименты по вхождениям в URL — выше по русскоязычным запросам, если вхождение ключевой фразы наблюдается только в URL, ранжируются документы с кириллическими адресами.

В Яндексе, документы с вхождением только в URL выстаиваются в следующем порядке:

  1. Кириллическое написание URL.
  2. Правильный транслит.
  3. Перевод слова на английский.

В Google — несколько иначе:

  1. Кириллическое написание URL.
  2. Перевод слова на английский.
  3. Транслит — не находятся вовсе.

Таким образом, если учитывать ТОЛЬКО данный фактор ранжирования (вхождения ключевого слова в URL), то тут пальму первенства вырывает кириллическое написание (по-русски), как сейчас у вашего сайта. Но!

Внешние ссылки и удобство использования

Но далее встает вопрос удобства работы с сайтом и большого числа прочих факторов ранжирования. Здесь уже на первое место уверенно выходит правильный транслит, так как:

  • Если приоритетный поисковик для вас это Яндекс, то преимущество правильного транслита в URL перед переводом на английский, перевешивает отставания данного вида ЧПУ в Google.
  • Внешние безанкорные ссылки на внутренние страницы сайта с кириллицей будут выглядеть вот так: http://domain.ru/%D1%82%D1%80%D0%B5%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8/%D0%BF %D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-D1%82%D1%80%D0%B5%D0%BD%D0 %B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA-%D0%BD%D0%B0-%D0%B1%D0%B5%D0%B3%D0%BE%D0 %B2%D0%BE%D0%B9-%D0%B4%D0%BE%D1%80%D0%BE%D0%B6%D0%BA%D0%B5-%D0%B4%D0%BB%D1%8F-%D0%BF%D0%BE%D1%85%D1%83%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F.
    Что, с очевидностью, уменьшает их привлекательность и желание использовать рядовым пользователям.
  • Если вы будете устанавливать на данные кириллические адреса внешние ссылки со сторонних сайтов, то столкнётесь с рядом проблем, которые заключаются в том, что не все системы нормально будут интерпретировать URL с русскими символами.
  • Аналогичные трудности будут и с установкой 301-редиректов с документа на документ внутри сайта.
  • Для набора URL-адреса внутренней страницы на вашем сайте — потребуется переключать раскладку клавиатуры.
Читайте также  Распиновка разъема питания леново

Совокупность всех данных факторов, в конечном итоге, перевешивает мизерный проигрыш ЧПУ с транслитом в ранжировании (по отношению к кириллице).

Итого: для работы и продвижения сайта в Яндексе, мы рекомендуем использовать правильный транслит в URL. Для Google — перевод на английский. Удачи в работе!

Итак, сегодня хотела написать немного об использовании кириллицы в ЧПУ. На мой взгляд русскоязычные ссылки были бы очень хороши, если бы не. Ходят слухи что они не доступны браузерам, поисковикам и другим системам, а в адресной строке браузера отображается что-то совершенно ужасное. Вот о всех плюсах, минусах, слухах и реализации на сайтах я бы и хотела рассказать.

Итак, пример того как можно использовать русский язык в URL можно увидеть прямо в адресной строке вашего браузера. Там должно быть написано следующее:

Заглянем что говорит по этому поводу официальная спецификация HTML 4.01:

Что примерно означает следующее:

Следуя рекомендациям экранируем нашу ссылку, мы получим примерно следующее.

Отметим особо, что ссылка у нас получилась в (экранированной) кодировке UTF-8, и её длинна соответственно возрасла. Вебмастера чьи сайты используют в качестве основной кодировки win-1251 (как например этот сайт) должны обрабатывать имя ссылок особо, например можно перевести её в нужную вам кодировку.

Зайдём по ссылке браузером, и вуаля, он нам показывает чистый русский язык.

В IE8 к сожалению чистый русский язык будет только если там адрес вбивать вручную. Но, таков уж IE =).

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

Гугл словам в ссылках значения не даёт, кроме того, слова соединённые через подчёркивание считаются с его точки зрения одним, для разделителей лучше использовать минус (дефис). Этот факт горячо обсуждался на xpoint.ru. Однако правильно сформированные русскоязычные ссылки он тоже отображает.

Теперь время для небольшого интервью, я опросила коллег на эту тему:

Резюме: Поддержка русского языка в ссылках на уже хорошем уровне есть. Однако многие вебмастера пока не видят смысла в её использовании. Теоритически возможно использование ключевых слов в урл для вывода страницы в яндекс.

Комментарии:

Хочу попросить автора статьи рассказать как сделать URL на русском языке. Хочу сделать русский URL у себя на сайте но чё то никак не могу разобраться )
буду благодерен за инфу
мыло : sava-933933@mail.ru

Итак, ярослав, для того чтобы сделать url на русском, предполагается что у вас уже есть реализация url на английском, если вы сами писали себе сайт.
В базе данных, url хранится в кодировке utf-8[u][/u], не важно в какой кодировке сам сайт. Если сайт в кодировке 1251, то при сохранении конвертируете кодировку в Utf-8.
Когда вы показываете ссылку на странице блога — нужно также ту часть которая содержит русский язык обработать php-функцией urlencode.
Соответственно потом, чтобы найти новость, вы парсите url, и ищете по той части его которая содержит русский язык. sql запрос выглядит примерно так:
SELECT . where . CONVERT(`caption_latin` USING utf8) = CONVERT(».$pname.» USING utf8) . где caption_latin имя столбца содержащего ваш url в кодировке utf8.

я только начинающий веб-мастер, поэтому мне кое что непонятно. Если честно мне бы подошла инструкция "для чайников" по этому вопросу ))
как сохранить кодировку в Utf-8?
как обработать русский язык php-функцией?
что такое парсить url?
Извеняюсь если какие то вопросы покажутся смешными, но я только учусь )
Ещё хорошо бы было показать пример кода до и после (т.е. какие изменения в код нужно внести что бы получить русские буквы в URL), думаю новичкам таким как я так будет легче разобраться.
Заранее спасибо.

Читайте также  Пробел строка в инстаграм

. Прошло 2 года спустя публикации этой статьи. Народ вовсю пользует возможность задавать кириллические ссылки; Яша этому рад; саперы тоже рады; не слишком давно регистраторам разрешили раздавать IDN-домены; даже зону на кириллице ввели (хотя и выдают, как я понял, алиасы для каждого домена в уникоде ).
Все это не может не радовать.
А вот делать правильный редирект (имею ввиду 301) научились не все(?). Потому как header`ы не принимают кириллические ссылки. Чего только не делют похапэшники со строками перед вставкой в header(‘Location: ‘.СЮДА);

Нет ли у автора(ов) блога соображений на эту тему? Востребованная статья может получиться )

У автора (меня т.е.) соображения конечно есть. Подготовка ссылки для 301 редиректа вообще никак не отличается от подготовки ссылки для html. Я уже писала о том мой блог поддерживает автоисправление ссылок.
Вот ради интереса можете стереть в адресной строке год, или месяц, или вообще дату целиком. Или можете просто нажать Эту ссылку. Вас снова поредиректит на эту статью.
В случае если у вас движок хранит данные в win-1251 вам следует выполнить 2 действия:

  • Перевести поле отвечающее за ЧПУ ссылки в кодировку UTF8
  • Выводить это поле в ссылке, используя urlencode() в PHP. (не всю ссылку а только данную часть url).

Если у вас движок всё хранит в utf — ну вы поняли, да? =)

Долго я возился с этим.

И раньше все делал как и было сказано в статье: переводил в utf-8, потом экранировал. По-разному экспериментировал.
А оказалось, проблема в том, что urlencode() просто экранировал слеш.

Спасибо, из-за статьи снова взялся разбираться с функцией. Разобрался ) Вот ф-ция на php:

function redirectto($redirect_link)
<
$redirect_link=iconv(‘windows-1251’, ‘utf-8’, $redirect_link);
$redirect_link=urlencode($redirect_link);
$redirect_link=str_replace(‘%2F’, ‘/’, $redirect_link);
header(‘Location: ‘.$redirect_link.»);
>

День добрый. У меня такой вопрос. Обо всем по порядку. Хочу сделать, чтобы urn имел возможность быть на русском (да, вот так я выразился)).
Собственно, что делать?)
Пользователь пытается зайти на адрес host.domen/2011/статья-1/
Как мне перехватить это? Ловить все запросы отправляемые на 404? Но тогда будет возвращаться код 404 вместо 200. Или сделать "мягкую ошибку 404" с кодом возврата 200? (кстати как это сделать не понимаю).
Или настраивать .htaccess для редиректа 301? Но тогда будет делаться редирект (парадокс, да?)). А в силу того, что имена всех файлов и папок на хосте только латиницей url будет меняться на host.domen/2011/statja-1/ (это верный адрес страницы). Но я такой не хочу) Хочу чтобы в строке адреса так и отображался host.domen/2011/статья-1/ Используя ErrorDocument 404 адрес в адресной строке остается как раз таким. Что позволяет немного обмануть природу и использовать русский на сервере, где это делать нельзя) Вобщем, есть идеи?

Буду копать пока mod_rewrite

Таки мощный инструмент mod_rewrite. Но малость неудобно с ним работать. Можно было сделать проще. Хотя, это, судя по всему, вызвано его внутренней сложностью. Или просто влияние "старой школы". Все-таки когда он был разработан то. Ну да не суть, главное сделал я все) Но с mod_rewrite вариант оказался не таким гибким. Лучше такие всю обработку оставить на php собирая неверный запросы в 404.

В нашем движке используется следующее правило для mod_rewrite:

RewriteCond % !-f
RewriteRule ^(.*)$ index.php?rewrite_url_query_toget=$1 [L,QSA]

Что я вам и рекомендую. Это позволяет получить адрес страницы из переменной $_GET[‘rewrite_url_query_toget’];

Можно использовать просто RewriteRule ^(.*)$ index.php [L,QSA] , но в таком случае адрес страницы нужно брать из переменной $_SERVER[‘REQUEST_URI’] что будет не совсем верно если движок установлен в папку, а не в корень.

Собирать страницы через обработку 404 запросов, не совсем правильно. Во-первых может быть что по умолчанию вернётся 404 статус. Во-вторых апач может попытаться отдать страницу через протокол HTTP 1.0 вместо HTTP 1.1, потому что страницу 404 нужно возвращать именно через HTTP 1.0, т.е. не используя метод chunked для выдачи, что тоже приведёт к ошибке. И т.п.
А mod_rewrite действительно сложен именно в силу своей универсальности. При должном изучении вы сможете с помощью его делать очень многое.

Читайте также  Прикольные никнеймы для парней на русском

Ну первые две проблемы решаются с помощью посылки заголовка HTTP/1.1 200 Ok. Но в том, что это не совсем правильно, я, конечно, согласен) Это все-таки обходной путь. Я бы его не трогал, если бы все ровненько "склеилось" с mod-rewrite. У меня склеилось, но как-то кривовато. Ну за час этот механизм не освоить точно. Попробую поэкспериментировать с Вашими командами в mod_rewrite.

Всем привет! Увидел просьбу прокомментить хоть на пару слов, и вот у меня сайты на WordPress, там это дело автоматизировано во всех записях и страницах использую название на русском языке, отображается во всех основных браузерах нормально. И реально для пользователя это удобно.

Прикольная у вас страница ошибки)))))

Вы блин не залогинились и не поставили галочку. Ваш комментарий не сохранён. На случай если вы таки не бот, то вот он, скопируйте и попробуйте снова:

Здравствуйте!
В ie ваша ссылка отражается закодированной. Я так понимаю для ie на русском ссылки не зделать? Если фильтровать пользователей по браузерам и генерировать ссылки на русском для всех, кроме ie и на транслите для ie, то поисковики будут воспринимать данную страницу как две. Получается, что надо все делать в транслите или есть все-таки решения?

В адресную строку вводим например: mysite/?привет
код php
$chpu = $_SERVER[‘REQUEST_URI’];
echo $chpu;
код php
выводит что-то типо того: %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
вставляете в базу данных этот код и наслаждаетесь 🙂

Влад, в ие — страница будет отображаться закодированной только до 9й версии. Это менее 5% от всех браузеров.

Здравствуйте, очень интересная статья, многого не знал.
Однако я не совсем понял, как всё-таки решить проблему отображения русских символов в URL.
Я посмотрел "сырой исходник" (в Opera это Crl+U), и увидел, что у вас ссылка, на самом деле — UTF-8 после экранирования (escaped). Но при наведении в статусбаре браузера видны кракозябры, а после перехода — получается русский текст, как и надо. Уж как только не пробовал — и с экранированием, и без, и во всех кодировках (без конвертирования в UTF-8 и с оным). У меня при любом раскладе после перехода по ссылке получаются экранированные символы =(

UPD: разобрался. Оказывается, такой фокус не проходит с параметром. Только с частью пути, но не query_string. Мне кажется, стоит дополнить этот нюанс — а то мало ли. Мне-то и нужен был как раз путь, но для теста я сдуру выбрал параметр. Интересно, к слову, чем вызвана эта особенность, и кто всё-таки преобразует неэкранированные символы в экранированный вид — браузер или же веб-сервер. Ещё было бы интересно понять, что же уходит на сервер, когда в адресной строке видны русские буквы. Украшательство ли это со стороны браузера, или они правда уходят без экранирования?

И да, с параметрами тоже не всё так просто — ставил я однажды nginx без Apache, так там, кажется, параметры так и оставались на русском без замены. И вроде даже пришлось менять PHP код, чтобы оно заработало (хотя БД в той же кодировке была, что на девелоперском сервере). rewrite срабатывал, а данные приходили "плохие", как-то так.

Ссылка на основную публикацию
Adblock
detector