RSS

Прокоментируй статью, хотя бы пару слов!

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

  • #1avatar

    Ярослав

    12.02.2011 16:58:53

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

  • #2avatar

    Елена Лунная

    13.02.2011 04:22:59

    Итак, ярослав, для того чтобы сделать 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.

  • #3avatar

    Ярослав

    13.02.2011 10:20:06

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

  • #4avatar

    Bars (Денис Борзенко)

    12.04.2011 09:08:32

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

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

  • #5avatar

    Елена Лунная

    12.04.2011 10:43:20

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

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

  • #6avatar

    Bars (Денис Борзенко)

    12.04.2011 12:46:29

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

    И раньше все делал как и было сказано в статье: переводил в 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.'');
    }

  • #7avatar

    Spartak

    14.09.2011 10:00:09

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

  • #8avatar

    Spartak

    14.09.2011 12:32:19

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

  • #9avatar

    Spartak

    14.09.2011 14:20:26

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

  • #10avatar

    Елена Лунная

    14.09.2011 15:57:31

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

    RewriteCond %{REQUEST_FILENAME} !-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 действительно сложен именно в силу своей универсальности. При должном изучении вы сможете с помощью его делать очень многое.

  • #11avatar

    Spartak

    14.09.2011 16:40:40

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

  • #12

    FrolovS

    22.12.2012 14:45:23

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

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

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


  • #13avatar

    Влад

    16.01.2013 10:59:08

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

  • #14

    Пупкин

    29.01.2013 21:48:27

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

  • #15avatar

    Елена Лунная

    20.02.2013 00:41:35

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

  • #16avatar

    popov654 (popov654)

    25.12.2013 14:53:31

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

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

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

  • #17avatar

    Елена Лунная

    26.12.2013 12:38:28

    На т.н. location.hash - т.е. всё что существует после решётки существует своя спецификация. Поэтому да, браузер её увы экранирует.


Чтобы оставить комментарий нужно войти или зарегистрироваться (Регистрируйтесь за 5 секунд, без подтверждения email и т.п.).
Либо волшебно используйте ваш логин в Google, Яндекс, рамблер или ЖЖ чтобы войти через Open_ID
Подпишитесь на статьи через RSS

15 самых популярных статей: