Pull to refresh

Домен.РФ, кириллица в URL и кодировки: добро пожаловать в ад.

Здравствуйте. Итак, я человек которому очень не нравится английский язык, принципиально. А потому, я, ещё задолго до придумывания сильными и умными мира сего домена.РФ, загорелся целью сделать себе сайт с кириллическими ЧПУ. Сайт уже существует, хотя и параллельно дорабатывается до вменяемого состояния.

Но вот началось регистрация доменов.РФ, и скоро, надо полагать, там появятся первые сайты. И скорее всего владельцы кириллического домена захотят чтобы url из сайта выглядел не так: http://домен.рф/news/my_otkrylis/, а вот так: http://домен.рф/новости/мы_открылись/
А так, как я начала реализовывать нечто подобное, то думаю что мой опыт будет многим полезен. Особенно программистам и SEO специалистам — именно для них тут будет много весёлых, занимательных открытий, после которых у некоторых наверняка возникнет желание сделать что-то нехорошее с теми массовиками-затейниками, которые всё это придумали. Если бы я сам знал, что меня ждёт, никогда не стал бы так извращаться и сделал бы всё на латинице.

Итак, поехали.

ЧПУ и сам кириллический URL.


Как обстоит дело с обычными GET запросами вроде ?категория=новости&статья=мы_открылись, я не знаю, но думаю с тут проблем быть не должно. А вот если вы захотите сделать ЧПУ, то боюсь, что придётся вам его делать в коде самой страницы, а не через mod_rewrite, ибо последний кириллицу не понимает. В .htaccess крякозяблы приходят, вместо русских букв. И подружить .htaccess с кириллицей у меня так и не получилось (если кому-то это удастся, то пожалуйста, дайте знать как).

Но тут есть ещё один подводный камень. У меня весь сайт в кодировке cp1251. А от браузеров URL всегда приходит в UTF-8 кодировке, независимо от ОС и браузера. Но в случае, если вы будете делать header(), то тут прежде всего нужно будет перекодировать в юникод. Ибо после header() заголовок посылается уже в той кодировке, которая была в переданной строке, а не в юникоде.
И тут главное чтобы ie6 наконец уже окончательно канул в бездну, так как он, после header`а, в адресной строке отображает крякозяблы. Благо это только его баг, во всех остальных браузерах вроде всё работает как нужно.

Однако, боюсь, что дальше этого пойти не удастся. Я имею ввиду то, что внутренние ссылки не поддерживают кириллицу как минимум в ie6-8 (учитывая что ie занимает всё-таки лидирующие позиции среди пользователей интернета, да и пользоваться этими доменами будут в основном люди не всегда знающие о существовании других браузеров, кроме ie, то думаю что именно на этот браузер нужно ориентироваться в первую очередь).
Т.е. если есть ссылка с name="якорь", то при переходе с http://домен.рф/новости, на http://домен.рф/новости#якорь — страница перезагрузится. Так что клиентов, которые хотят чтобы на их свежекупленном домене.РФ не было латинских символов в принципе, придётся убеждать в необходимости латиницы в якорях.
Но это ещё цветочки, а ягодки пойдут дальше…

Кириллические URL`ы, поисковики и системы размещения рекламы.


А вот здесь начинается настоящий ад. Тут очень многое зависит от настроек сервера. Например, при работе сайта в сети обнаружились очень интересные особенности. А именно, при индексации некоторыми поисковиками и система размещения рекламы страниц с кириллическими URL`ами, сервер им выдавал 406 код ошибки, хотя сам скрипт всё обрабатывал как нужно, делал нужные sql запросы и получал всё необходимое содержимое. И оказалось, что в utf-8 кодировке URL приходит только от браузеров, а все остальные шлют запросы в том виде, в каком им хочется. В частности была и такая проблема с Яндексом. Вот часть ответа из службы поддержки по поводу причины такого явления:
Проверка показывает, что сервер формирует данный код ответа на запрос
документов в типе text/html. То есть, по какой-то причине, сервер, отдавая
text/html, считает, что он не может быть обработан роботом и формирует ответ
406 Not Acceptable.
Браузерам (например FireFox) отдается страница с кодом 200, так как они
отправляют запрос, который предполагает, что сервер может вернуть любой тип
контента, если нет возможности вернуть text/html, application/xhtml+xml или
application/xml (Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8).


Собственно после этого, я плюнул и решил перевести всё-таки все страницы сайта utf-8 кодировку. Но, как ни странно, это не помогло. А дело оказалось в том, что для правильного ответа сервера нужно не просто, чтобы сами ссылки были в юникоде, но и чтобы они были закодированы через urlencode(), иначе — всё равно 406 ошибка. В этом отношении меня порадовал только лишь Google. Ему всегда возвращается 200 код, в какой бы кодировке что не находилось.

Таким образом, для того, чтобы некоторые избранные могли проиндексировать вашу страницу, нужно чтобы они переходили по URL находящемуся в utf-8 кодировке и обработанному через urlencode(). Строка в win-1251 и urlencode() тоже не пройдёт, только юникод.

При этом обработать ссылки через urlencode() не всегда легко так легко. К примеру, что будет, если контент сайта внутри заполняется кем-то, кто не знает вообще про кодировки ничего и он создаст просто обычную внутреннюю ссылку вида href="/новости"? Более того, получается что таким системам и людям нужно подсовывать разные ссылки — людям обычные ссылки, а роботам ссылки после urlencode()? Да и с и с точки зрения того же Яндекса, будут ли одинаковыми ссылки http://домен.рф/новости и http://домен.рф/%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8? Не уверен. А при публикации ссылок на внешних ресурсах как быть?
Лично я решил эту проблему так: у меня просто определяется, что за клиент передо мной: из «чёрного списка», в котором все те, кому 406-ая ошибка когда надо и не надо возвращается, или нет. В первом случае при выводе в меню ссылки обрабатываются через urlencode() и весь основной контент страницы так же пропускается через функцию, которая ищет внутренние ссылки, и, если находит, то заменяет их на обработанные в urlencode().

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

Ну и на последок ещё одна «нехорошесть».


Ну вот всё описанное выше вы решили, и запустили сайт в сеть. Поставили счетчики статистики и вроде бы все рады, пока клиент не просмотрит статистику через cpannel и не увидит примерно следующее: /\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbe\xd1\x81\xd1\x82\xd0\xb8. Или на топ.мейл увидит всё те же самые URL`ы, закодированные через urlencode(). И вот попробуйте ему в таком случае объяснить, что вы тут не властны, и что это вовсе не то, что вы хотите скрыть от него кто и какие страницы сайта посещал. А ведь согласитесь, в таком представлении даже сведущему человеку не сразу понять что это за такое, а уж простому обывателю и подавно.

Таким образом, домен.РФ может и существует, может скоро и появятся сайты, где в адресной строке на латинице будет только http, но вот только проблем с такими сайтами будет очень много, как у их разработчиков, так и у оптимизаторов. Ну а пока все роботы и системы к этому привыкнут, подправят свои алгоритмы и начнут выводить и обрабатывать кириллические URL`ы как нужно, пройдёт немало времени.
Надеюсь я этим материалом помогу тем несчастным, которые будут всё-таки вынуждены создавать полностью кириллические сайты.

P.S. Этой мой первый пост на хабре. Извиняюсь, если что-то запостил не так и спасибо всем вам за прочтение. Я буду очень получить инвайт за этот пост)))
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.