Здравствуйте. Итак, я человек которому очень не нравится английский язык, принципиально. А потому, я, ещё задолго до придумывания сильными и умными мира сего домена.РФ, загорелся целью сделать себе сайт с кириллическими ЧПУ. Сайт уже существует, хотя и параллельно дорабатывается до вменяемого состояния.
Но вот началось регистрация доменов.РФ, и скоро, надо полагать, там появятся первые сайты. И скорее всего владельцы кириллического домена захотят чтобы url из сайта выглядел не так:
А так, как я начала реализовывать нечто подобное, то думаю что мой опыт будет многим полезен. Особенно программистам и SEO специалистам — именно для них тут будет много весёлых, занимательных открытий, после которых у некоторых наверняка возникнет желание сделать что-то нехорошее с теми массовиками-затейниками, которые всё это придумали. Если бы я сам знал, что меня ждёт, никогда не стал бы так извращаться и сделал бы всё на латинице.
Итак, поехали.
Как обстоит дело с обычными GET запросами вроде
Но тут есть ещё один подводный камень. У меня весь сайт в кодировке cp1251. А от браузеров URL всегда приходит в UTF-8 кодировке, независимо от ОС и браузера. Но в случае, если вы будете делать
И тут главное чтобы ie6 наконец уже окончательно канул в бездну, так как он, после header`а, в адресной строке отображает крякозяблы. Благо это только его баг, во всех остальных браузерах вроде всё работает как нужно.
Однако, боюсь, что дальше этого пойти не удастся. Я имею ввиду то, что внутренние ссылки не поддерживают кириллицу как минимум в ie6-8 (учитывая что ie занимает всё-таки лидирующие позиции среди пользователей интернета, да и пользоваться этими доменами будут в основном люди не всегда знающие о существовании других браузеров, кроме ie, то думаю что именно на этот браузер нужно ориентироваться в первую очередь).
Т.е. если есть ссылка с
Но это ещё цветочки, а ягодки пойдут дальше…
А вот здесь начинается настоящий ад. Тут очень многое зависит от настроек сервера. Например, при работе сайта в сети обнаружились очень интересные особенности. А именно, при индексации некоторыми поисковиками и система размещения рекламы страниц с кириллическими 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 кодировку. Но, как ни странно, это не помогло. А дело оказалось в том, что для правильного ответа сервера нужно не просто, чтобы сами ссылки были в юникоде, но и чтобы они были закодированы через
Таким образом, для того, чтобы некоторые избранные могли проиндексировать вашу страницу, нужно чтобы они переходили по URL находящемуся в utf-8 кодировке и обработанному через
При этом обработать ссылки через
Лично я решил эту проблему так: у меня просто определяется, что за клиент передо мной: из «чёрного списка», в котором все те, кому 406-ая ошибка когда надо и не надо возвращается, или нет. В первом случае при выводе в меню ссылки обрабатываются через
Да-да, вот такие вот мрак, ересь и танцы с бубном приходится использовать. И ведь всё равно, ничего хорошего из этого толком не получается. Получается что всё через задницу сделано, и работает так же. Хорошо только тем, кто не знает, где на клавиатуре английские буквы располагаются.
Ну вот всё описанное выше вы решили, и запустили сайт в сеть. Поставили счетчики статистики и вроде бы все рады, пока клиент не просмотрит статистику через cpannel и не увидит примерно следующее:
Таким образом, домен.РФ может и существует, может скоро и появятся сайты, где в адресной строке на латинице будет только http, но вот только проблем с такими сайтами будет очень много, как у их разработчиков, так и у оптимизаторов. Ну а пока все роботы и системы к этому привыкнут, подправят свои алгоритмы и начнут выводить и обрабатывать кириллические URL`ы как нужно, пройдёт немало времени.
Надеюсь я этим материалом помогу тем несчастным, которые будут всё-таки вынуждены создавать полностью кириллические сайты.
P.S. Этой мой первый пост на хабре. Извиняюсь, если что-то запостил не так и спасибо всем вам за прочтение. Я буду очень получить инвайт за этот пост)))
Но вот началось регистрация доменов.РФ, и скоро, надо полагать, там появятся первые сайты. И скорее всего владельцы кириллического домена захотят чтобы 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. Этой мой первый пост на хабре. Извиняюсь, если что-то запостил не так и спасибо всем вам за прочтение. Я буду очень получить инвайт за этот пост)))