За последние 24 часа нас посетили 17645 программистов и 1711 роботов. Сейчас ищут 980 программистов ...

Красивые адреса на русском языке

Тема в разделе "PHP для новичков", создана пользователем ID_Hacker, 10 сен 2013.

  1. ID_Hacker

    ID_Hacker Новичок

    С нами с:
    10 сен 2013
    Сообщения:
    6
    Симпатии:
    0
    Хочу адреса вида "site.ru/раздел/название_страницы". Где "раздел" означает место страницы в мнимом, реально не существующем, каталоге. "название страницы" это название страницы заданное при написании.

    Вопросы:
    1. Какие могут быть грабли в использовании русскоязычного текста в адресе?
    2. Как реализовать возможность обработки адреса в зависимости от части "раздел" разными скриптами, расположенных в разных файлах. (Это важно, чтобы при изменении/доработке скрипта контрольной панели, случайно не вывести из работы обработку простых страниц)
    3. Перенаправление на файл со скриптом делать через mod_rewrite или есть более подходящие методы?
    4. как лучше разбить URL на составные части "раздел" и "название_страницы"?
    5. Обязательно использование знака "_" между словами или можно использовать пробелы?

    Данные страниц будут хранится в базе данных. Скрипт должен обработать URL и собрать страницу опираясь на "раздел" и "название страницы". Так же часть URL "раздел" может быть не всегда использована

    "раздел" необходим для более простого определения где в базе находится текст страницы, каким скриптом обрабатывать. А так же для удобного группирования страниц и приятного логического оформления.
    В итоге будет выглядеть примерно так:
    "site.ru/контрольная_панель/редактор" (раздел редактора, раздел администратора)
    "site.ru/блог/случай_на работе" (раздел сайта блог)
    "site.ru/электротехника/трехфазные_системы" (раздел по электротехнике, страница про трёхфазную сеть)
    "site.ru" (главная страница)

    Когда делал дипломную работу, тогда пользовался такими ссылками site.ru?id=3, теперь же делаю CMS для себя, хочу сразу сделать красиво.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. ID_Hacker

    ID_Hacker Новичок

    С нами с:
    10 сен 2013
    Сообщения:
    6
    Симпатии:
    0
    igordata Это связанно с тем что кому то давно пора перейти на юникод.
    Так открывает твою ссылку Internet Explorer 8
    [​IMG]
    Вот так открывает Mozilla 23
    [​IMG]
    В мозилле даже при наведении курсора на ссылку, в строке состояния отображается
    Код (Text):
    1. http://site.ru/русский язык
    У меня весь сайт будет в UTF-8 как и хранящаяся информация в базе данных. Радует то, что превращаясь в кракозябры ссылка остаётся рабочей, ресурс я делаю для себя, поэтому гоняться за поддержкой устаревших мамонтов не собираюсь.

    Столкнулся с первыми граблями, настроил mod_rewrite
    Код (Text):
    1. RewriteEngine On
    2. RewriteBase /
    3. RewriteCond %{REQUEST_FILENAME} !-f
    4. RewriteCond %{REQUEST_FILENAME} !-d
    5. RewriteRule ^(.*)$ index.php [L,QSA]
    перенаправление работает, но скрипт echo($_SERVER[REQUEST_URI]); выводит при запросе
    http://www.idhacker.ru/страница
    это /%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0
    Как мне преобразовать эти коды в нормальный текст? Эти косяки уже в REQUEST_URI или это функция echo так преобразовывает?
     
  4. ID_Hacker

    ID_Hacker Новичок

    С нами с:
    10 сен 2013
    Сообщения:
    6
    Симпатии:
    0
    Помогло echo (urldecode($_SERVER[REQUEST_URI]));
    Я так понимаю строка в URL передаётся в другой кодировке, поэтому в $_SERVER[REQUEST_URI] получалась закодированная строка, и для обработки адреса мне всегда надо преобразовывать $_SERVER[REQUEST_URI]

    В общем, вполне работает таким образом, не зависимо от того на русском языке адрес или на английском, можно сделать многоязыковую адресацию. Пробелы в адресе можно свободно использовать. Первый элемент массива, с индексом 0, пустой, т.к. в начале адреса стоит "/".

    Код (Text):
    1. $adres = urldecode($_SERVER[REQUEST_URI]);
    2. $explode_adres = explode ("/", $adres);
    3. $page_adres = array_pop($explode_adres);
    4. $part_adres = array_pop($explode_adres);
    Остаётся добавить необходимые проверки и преобразования безопасности.
    • Если в $page_adres ничего нет то переходить на главную страницу.
    • В зависимости от $part_adres искать страницу в определённой таблице. Если раздела нет, то страница из корневого раздела сайта.
    • Так же можно проверять наличие в $adres любых символов кроме букв и "/", при присутствии таковых сразу выводить страничку 404.
    • Ещё сделать проверку, если после функции explode() больше составляющих чем необходимо, так же слать на 404.
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    почему именно два раза последний элемент берете?
     
  6. RainBowDash

    RainBowDash Активный пользователь

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    чтобы наверняка ;D
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а ты скопируй и вставь в блокнот например.

    Добавлено спустя 1 минуту 19 секунд:
    array_pop отрезает. так что это два разных элемента.
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    внимательней посмотри. зачем нам нужен второй аррай поп если мы результат получили в $page_adres
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    http://php.ru/manual/function.array-pop.html внимательное чтение явно не твой конек, но ты уж постарайся. Без этого никак в программировании. Старайся ловить детали в отличиях.
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    может ты сам обьяснишь дабы не ссылаясь на написанное, снова отмазка у тебя.
    еще раз:
    Добавлено спустя 4 минуты 7 секунд:
    Код (PHP):
    1. <?php
    2. $adres = "qqq/sssss/cccccc/";
    3. $explode_adres = explode ("/", $adres);
    4. $page_adres = array_pop($explode_adres);
    5. $part_adres = array_pop($explode_adres);
    6. echo "$page_adres - $part_adres"; 
    понял теперь )
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Такая вот хитрая функциональность видимо со времен когда не было форыча
     
  12. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Чуваки, чота вы мене загрузили, насколько я помню, первый array_pop должен вертать пустоту, ибо указатель автоматом перекидывается к несуществующему еще элементу массива.
    пойду проверю )
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не, ты че. нафик он тогда нужен был бы.
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    ^_^
     
  15. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    А чо, берем кусок примера от MAN_IFE_ST, дабы не плодить всякого
    Код (PHP):
    1. var_dump($page_adres,$part_adres); 
    И видим:
    Код (PHP):
    1. string(0) ""
    2. string(6) "cccccc"
    Йопта, ой.

    З.Ы. php 5.5.3
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  17. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    тьфу, спать пойду, у MAN_IFE_ST же слэш в конце строки, все спаааааать =)
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень