За последние 24 часа нас посетили 51343 программиста и 1758 роботов. Сейчас ищут 743 программиста ...

Как сделать ЧПУ

Тема в разделе "PHP для новичков", создана пользователем greenzlat, 23 мар 2011.

  1. greenzlat

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

    С нами с:
    27 апр 2008
    Сообщения:
    255
    Симпатии:
    0
    Есть БД. Там хранится URL страницы.
    id
    title
    text
    url
    Как сделать один файл, чтоб об обрабатывал определенный запрос. Например чтоб на странице выводился текст, а эта url этой страницы был такой, которой соотвестствует полю url в БД.
    Например есть таблица:
    1 Новости тексттновости
    2 О компании текстОкомпании about
    Если жму по ссылке НОВОСТИ то в адресной строке выходит www.mysite/news и выводится текстновости, а если жму ссылку о компании, то соответственно www.mysite/about и текстОкомпании.
    Может ссылочку дадите где это почитать?
     
  2. Almere

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

    С нами с:
    8 фев 2011
    Сообщения:
    53
    Симпатии:
    0
    greenzlat,
    с помощью .htaccess ??
     
  3. greenzlat

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

    С нами с:
    27 апр 2008
    Сообщения:
    255
    Симпатии:
    0
    Да.
     
  4. Almere

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

    С нами с:
    8 фев 2011
    Сообщения:
    53
    Симпатии:
    0
    greenzlat
    Я вырвал куски из DataLife Engine.

    Код (Text):
    1.  
    2. RewriteRule ^servers(/?)+$ index.php?do=cs [L]
    3. RewriteRule ^addserver.html$ index.php?do=cs-add [L]
    4. RewriteRule ^add-complete.html$ index.php?do=cs-add&add [L]
    5. RewriteRule ^server(/?)+$ index.php?do=cs-full [L]
    6. RewriteRule ^server/([^/]+)-([^/]+).html$ index.php?do=cs-full&ip=$1&port=$2 [L]
    гугл вроде-как работает...

    http://crazy-russian.ru/development/kak ... ccess.html
    http://www.art-shok.ru/advice/htaccess-examples/
     
  5. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    RewriteEngine on
    RewriteBase /

    RewriteRule ...
     
  6. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    greenzlat

    Код (Text):
    1. RewriteEngine on
    2. RewriteCond %{REQUEST_FILENAME} !-d
    3. RewriteCond %{REQUEST_FILENAME} !-f
    4. RewriteCond %{REQUEST_URI} !=/favicon.ico
    5. RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
    внутри файла index.php ловишь переменную $_GET['route']
     
  7. kir55rus

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

    С нами с:
    11 дек 2009
    Сообщения:
    20
    Симпатии:
    0
    Gromo, вы делаете проверку пути к странице: Если это не каталог, не файл и не иконка, тогда делаем из ссылки site.ru/about.php ссылку index.php?route=about.php
    так понял?
     
  8. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    kir55rus
    если запрошенного файла или каталога не существует - отдать на растерзание index.php в виде $_GET параметра route.
    если запрашивается иконка /favicon.ico, то данный запрос игнорируется, даже если файл favicon.ico не существует.
     
  9. kir55rus

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

    С нами с:
    11 дек 2009
    Сообщения:
    20
    Симпатии:
    0
    новую тему создавать не буду.. название похоже.

    есть проблема, прописал в .htaccess следующее:
    Код (Text):
    1. RewriteEngine On
    2. RewriteRule ^поздравления/(.*).html(/?)+$ pozdravleniya.php?poz=$1 [L]
    этот вариант не работает, выводится сообщение not found

    но все отлично работает, если сделать так:
    Код (Text):
    1. RewriteEngine On
    2. RewriteRule ^pozdravleniya/(.*).html(/?)+$ pozdravleniya.php?poz=$1 [L]
    в чем проблема? разве нельзя работать с кириллическими символами? а как тогда сделали на Википедии?
     
  10. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    мб сохранить файл в другой кодировке.
    p.s хотя не уверен что htaccess поддерживает кириллицу
     
  11. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а вот как у меня пример, так и на википедии.
    по крайней мере у меня все киррилические урлы работают :)
    главное - в кодировке не ошибиться. ютф8 рулит
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    route не нужен, родной
     
  13. kir55rus

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

    С нами с:
    11 дек 2009
    Сообщения:
    20
    Симпатии:
    0
    в $_GET['route'] будет хранится вся адресная строка?
    но ведь так не удобно потом будет извлекать из нее нужные данные.

    зы:прочитал статью около часа назад, там было написано, что яндекс не может сканировать сайты с кириллическими ЧПУ, правда ли это? на счет гугла было написано, что он это проходит нормально.

    зы2:лучше для оптимизации делать ссылки транслитом или переводом строк?
    т.е. из ссылки на статью "Как дела" лучше делать site.ru/how-are-you/ или site.ru/kak-dela/
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    kir55rus
    что яндекс не может сканировать сайты с кириллическими ЧПУ
    блин, википедию он не может сканировать? неужели блин ни на секунду не научили задумываться хоть чуть-чуть над всем тем что тебе говорят? =) это может стать проблемой в старости...
     
  15. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а мне нужен, т.к. там могут подаваться и другие данные посредством $_GET
     
  16. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Gromo

    Наверное имеется в виду, что REQUEST_URI парсить можно вместо route. В принципе это правильно) Меньше операций, меньше переменных
     
  17. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    tommyangelo
    как вариант - да. REDIRECT_URL )))
    т.к. REQUEST_URI показывает всю строку запроса вместе с $_GET данными.
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    именно это я и хотел сказать. Мне кажется стоит больше доверять пхп. гет в гете искать, пост в посте, а урл в реквест_ури.

    у меня это выглядит так:
    Код (Text):
    1. <IfModule mod_rewrite.c>
    2.   RewriteEngine on
    3.   RewriteCond %{REQUEST_FILENAME} !-f
    4.   RewriteCond %{REQUEST_FILENAME} !-d
    5.   RewriteCond %{REQUEST_URI} !=/favicon.ico
    6.   RewriteRule ^.*$ index.php [L,QSA]
    7. </IfModule>
    что значат вторая и третья строка - я не в курсах =)
     
  19. kir55rus

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

    С нами с:
    11 дек 2009
    Сообщения:
    20
    Симпатии:
    0
    решил сделать я через транслит, но теперь проблема с постраничной навигацией.
    вот правила:
    Код (Text):
    1. RewriteEngine On
    2. RewriteRule ^pozdravleniya/([0-9]{1,3})-(.*)\.html\?page=([1-9]{1,3})$ pozdravleniya.php?id=$1&page=$3 [L]
    3. RewriteRule ^pozdravleniya/([0-9]{1,3})-(.*)\.html$ pozdravleniya.php?id=$1 [L]
    4. RewriteRule ^scenarii/([0-9]{1,3})-(.*).html$ scenarii.php?id=$1 [L]
    5. RewriteRule ^tosty/([0-9]{1,3})-(.*).html$ tosty.php?id=$1 [L]
    6. RewriteRule ^razvlecheniya/([0-9]{1,3})-(.*).html$ razvlecheniya.php?id=$1 [L]
    не работает строка
    Код (Text):
    1. RewriteRule ^pozdravleniya/([0-9]{1,3})-(.*)\.html\?page=([1-9]{1,3})$ pozdravleniya.php?id=$1&page=$3 [L]
    опытным путем выяснил, что не работает из-за знака ?
    если использовать др. символы для разделения .html и page=2 то все ок. как только использую ?, ничего не работает.

    вот кстати адресная строка, которая должна попадать под обработку:
    pozdravleniya/1-s-dnem-rozhdeniya-muzhchine.html?page=2

    благодарен за помощь

    ***добавлено
    пожалуй сделаю добавку, что с правилом
    Код (Text):
    1. RewriteRule ^pozdravleniya/([0-9]{1,3})-(.*)\.html.page=([1-9]{1,3})$ pozdravleniya.php?id=$1&page=$3 [L]
    работают все символы, но опять кроме знака ?
     
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    потому что знак вопроса - служебный символ, как и ^ и $
    надо экранировать \?
     
  21. kir55rus

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

    С нами с:
    11 дек 2009
    Сообщения:
    20
    Симпатии:
    0
    я вроде итак его экранировал. как и точку перед html
    Код (Text):
    1. RewriteRule ^pozdravleniya/([0-9]{1,3})-(.*)\.html\?page=([1-9]{1,3})$ pozdravleniya.php?id=$1&page=$3 [L]
    ****Проблему решил. подправил код. вот итог, если кому интересно:

    Код (Text):
    1. RewriteEngine On
    2. RewriteRule ^pozdravleniya/([0-9]{1,3})-(.*)\.html(/?)+$ pozdravleniya.php?id=$1 [L,QSA,NE]
    3. RewriteRule ^scenarii/([0-9]{1,3})-(.*).html(/?)+$ scenarii.php?id=$1 [L,QSA,NE]
    4. RewriteRule ^tosty/([0-9]{1,3})-(.*).html(/?)+$ tosty.php?id=$1 [L,QSA,NE]
    5. RewriteRule ^razvlecheniya/([0-9]{1,3})-(.*).html(/?)+$ razvlecheniya.php?id=$1 [L,QSA,NE]