"нормальные" ссылки вместо GET-запросов. PHP.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
- mr. brightside
- сержант
- Сообщения: 260
- Зарегистрирован: 2010-04-17 17:32:39
- Откуда: Saint-Petersburg
"нормальные" ссылки вместо GET-запросов. PHP.
Добрый день, уважаемые!
Я новичок в PHP, поэтому прошу сильно не пинать.
Несмотря на то, что на php пишу недавно, я уже успел слепить пару сайтов. Сайты простые, для них написал свои CMS, которые тоже ничем выдающимся не выделяются:
- Есть главный контроллер index.php в корне сайта, который рулит всем
- Есть база данных, в которой я храню и контент и регистрационные данные пользователей
Так как сайты до боли простые, то этого вполне достаточно.
Однако, меня давно волнует одна проблема, которую я никак не могу решить
В пределах моего сайта все переходы осуществляются с помощью таких вот ссылок:
site/?category?page=pageName - т.е. через обычный GET-запрос.
Далее, мой обработчик смотрит, какая категория (category) у статьи, какая статья (page) и выводит мне нужную запись из БД.
Я хочу переделать такое поведение и получить нормальные ссылки, вида site/category/pageName.
Однако, я не хочу плодить директории (category) в папке сайта или файлы (pageName), хочу, чтобы всё также продолжало храниться в БД, но выводилось красиво.
Можно ли это как-нибудь решить? через getcwd() или реферрер, я не знаю...
За подсказку буду крайне признателен!
Я новичок в PHP, поэтому прошу сильно не пинать.
Несмотря на то, что на php пишу недавно, я уже успел слепить пару сайтов. Сайты простые, для них написал свои CMS, которые тоже ничем выдающимся не выделяются:
- Есть главный контроллер index.php в корне сайта, который рулит всем
- Есть база данных, в которой я храню и контент и регистрационные данные пользователей
Так как сайты до боли простые, то этого вполне достаточно.
Однако, меня давно волнует одна проблема, которую я никак не могу решить
В пределах моего сайта все переходы осуществляются с помощью таких вот ссылок:
site/?category?page=pageName - т.е. через обычный GET-запрос.
Далее, мой обработчик смотрит, какая категория (category) у статьи, какая статья (page) и выводит мне нужную запись из БД.
Я хочу переделать такое поведение и получить нормальные ссылки, вида site/category/pageName.
Однако, я не хочу плодить директории (category) в папке сайта или файлы (pageName), хочу, чтобы всё также продолжало храниться в БД, но выводилось красиво.
Можно ли это как-нибудь решить? через getcwd() или реферрер, я не знаю...
За подсказку буду крайне признателен!
Только FreeBSD, только хардкор
Услуги хостинговой компании Host-Food.ru
Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
-
- старшина
- Сообщения: 427
- Зарегистрирован: 2008-10-03 18:52:02
Re: "нормальные" ссылки вместо GET-запросов. PHP.
mod_rewrite
перенаправляешь все запросы на index.php, а в нем уже сам парсишь $_SERVER['REQUEST_URI']...
перенаправляешь все запросы на index.php, а в нем уже сам парсишь $_SERVER['REQUEST_URI']...
- mr. brightside
- сержант
- Сообщения: 260
- Зарегистрирован: 2010-04-17 17:32:39
- Откуда: Saint-Petersburg
Re: "нормальные" ссылки вместо GET-запросов. PHP.
ооо!rmn писал(а):mod_rewrite
перенаправляешь все запросы на index.php, а в нем уже сам парсишь $_SERVER['REQUEST_URI']...
большое спасибо!
Только FreeBSD, только хардкор
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
о, тоже подобное интересует:
есть с десяток ссылок типа:
как в mod_rewrite их переделать в вид:
как то сделал, теперь с site/name переходит на site/index.php?act=1 но отображается все равно site/index.php?act=1 а не site/name
а как сделать чтобы и отображаелось как site/name?
есть с десяток ссылок типа:
Код: Выделить всё
site/index.php?act=1
site/index.php?act=2
site/index.php?act=10
Код: Выделить всё
site/name
site/xxx
...
site/yyy
а как сделать чтобы и отображаелось как site/name?
- mr. brightside
- сержант
- Сообщения: 260
- Зарегистрирован: 2010-04-17 17:32:39
- Откуда: Saint-Petersburg
Re: "нормальные" ссылки вместо GET-запросов. PHP.
То, что мне помогло понять, как оно работает:
http://ruseller.com/lessons.php?rub=29&id=740
http://habrahabr.ru/company/sprinthost/blog/129560/
http://habrahabr.ru/post/140693/
Мой пример:
Есди же надо передавать несколько параметров - пишет соответствующую регулярку и добавляем параметро $2.
Кроме того, рекомендуется использовать:
Первый блок <FilesMatch> исключит из вывода файлы с нужным нам расширением.
параметр Options запретит листинг директорий браузером и будет выплевывать Forbidden.
Для того, чтобы заработало Options необходимо, чтобы в Апаче было разрешено AllowOverride On.
Да, еще очень классный .htaccess у Drupal. Большую часть своего .htaccess я взял оттуда
http://ruseller.com/lessons.php?rub=29&id=740
http://habrahabr.ru/company/sprinthost/blog/129560/
http://habrahabr.ru/post/140693/
Мой пример:
Код: Выделить всё
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule "(^|/)\." - [F] #закрываем доступ к скрытым директориям, начинающимся в данном случае с точки
RewriteCond %{REQUEST_FILENAME} !-f #исключаем из обработки существующие в файловой системе файлы...
RewriteCond %{REQUEST_FILENAME} !-d #...и папки
RewriteCond %{REQUEST_URI} !=/favicon.ico #запрещает открывать favicon
RewriteRule ^action/(.*) index.php?action=$1 [L] #собственно сами обработчики. Если у нас страница site/action/login, то управляющему скрипту передастся site/?action=login
RewriteRule ^page/(.*) index.php?page=$1 [L] #аналогично
</IfModule>
Кроме того, рекомендуется использовать:
Код: Выделить всё
<FilesMatch "\.inc$">
Order allow,deny
</FilesMatch>
Options -Indexes
параметр Options запретит листинг директорий браузером и будет выплевывать Forbidden.
Для того, чтобы заработало Options необходимо, чтобы в Апаче было разрешено AllowOverride On.
Да, еще очень классный .htaccess у Drupal. Большую часть своего .htaccess я взял оттуда
Только FreeBSD, только хардкор
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
такс... сделал по статьям - работает...
тока...
RewriteRule ^rec/ index.php?act=3
отлично переходит на site/rec/ - и отрабатывает что надо...
но если пройти по site/rec - то 404 выползает... ругань на File does not exist
при этом дозаписть / на апаче включена... а вот тут конкретно - она не работает...
тока...
RewriteRule ^rec/ index.php?act=3
отлично переходит на site/rec/ - и отрабатывает что надо...
но если пройти по site/rec - то 404 выползает... ругань на File does not exist
при этом дозаписть / на апаче включена... а вот тут конкретно - она не работает...
- mr. brightside
- сержант
- Сообщения: 260
- Зарегистрирован: 2010-04-17 17:32:39
- Откуда: Saint-Petersburg
Re: "нормальные" ссылки вместо GET-запросов. PHP.
а так:QweЯty писал(а):такс... сделал по статьям - работает...
тока...
RewriteRule ^rec/ index.php?act=3
отлично переходит на site/rec/ - и отрабатывает что надо...
но если пройти по site/rec - то 404 выползает... ругань на File does not exist
при этом дозаписть / на апаче включена... а вот тут конкретно - она не работает...
Код: Выделить всё
RewriteRule ^rec index.php?rec [L]
Только FreeBSD, только хардкор
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
а потом сравнивать уже весь массив $_GET['']; ?
- mr. brightside
- сержант
- Сообщения: 260
- Зарегистрирован: 2010-04-17 17:32:39
- Откуда: Saint-Petersburg
Re: "нормальные" ссылки вместо GET-запросов. PHP.
хм, да, это менее удобно, особенно, если GET'ов много - надо будет добавлять на каждый новый вид GET-запроса свой блок обработки.QweЯty писал(а):а потом сравнивать уже весь массив $_GET['']; ?
Однако, такой подход реализован в движке на файлах mqblog. Там GET/POST запросы, а также массив COOKIES раскидывается блоками вида:
Код: Выделить всё
foreach($_GET as $k => $v) {
$_v[$k] = $v;
}
Т.е., если у нас GET-запрос вида index.php?action=login, то на выходе мы получим GET["action"] со значением login.
Дальше обработчик ищет папку action и в ней файлик login. Подключает его и выполняет то, что есть в этом файлике.
Не знаю, вдруг такой подход окажется удобным.
Вероятно, есть возможность получить нужное на уровне апача и .htaccess, но я пока не знаю, как решить

Только FreeBSD, только хардкор
- FreeBSP
- майор
- Сообщения: 2020
- Зарегистрирован: 2009-05-24 20:20:19
- Откуда: Москва
Re: "нормальные" ссылки вместо GET-запросов. PHP.
я думаю лучше отдельно обрабатывать ^rec& и отдельно ^rec/
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
- mr. brightside
- сержант
- Сообщения: 260
- Зарегистрирован: 2010-04-17 17:32:39
- Откуда: Saint-Petersburg
Re: "нормальные" ссылки вместо GET-запросов. PHP.
так а запрос вида site/rec/ и должен отличаться от site/rec, т.е. за слешем в запросе site/rec/ и должен передаваться параметр act=$1, а запрос вида site/rec - это то же самое, что index.php?rec без передаваемого параметра, поэтому это два разных запроса. Вероятно, совет:QweЯty писал(а):такс... сделал по статьям - работает...
тока...
RewriteRule ^rec/ index.php?act=3
отлично переходит на site/rec/ - и отрабатывает что надо...
но если пройти по site/rec - то 404 выползает... ругань на File does not exist
при этом дозаписть / на апаче включена... а вот тут конкретно - она не работает...
является правильнымFreeBSP писал(а):я думаю лучше отдельно обрабатывать ^rec& и отдельно ^rec/
Только FreeBSD, только хардкор
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
честно, что то не так с оперой творится...
не первый раз уже правлю htaccess, а изменения начинают работать только после того как я перезапущу оперу пару раз.
все работает вот так, вернее вчера оставил после попыток заставить нормально работать:
сейчас - все идеально работает...
хотя вчера не работало.
не первый раз уже правлю htaccess, а изменения начинают работать только после того как я перезапущу оперу пару раз.
все работает вот так, вернее вчера оставил после попыток заставить нормально работать:
Код: Выделить всё
RewriteRule ^rec index.php?act=3
хотя вчера не работало.
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
то бишь работает в обоих случаях, если ввести site/rec и site/rec/
- FreeBSP
- майор
- Сообщения: 2020
- Зарегистрирован: 2009-05-24 20:20:19
- Откуда: Москва
Re: "нормальные" ссылки вместо GET-запросов. PHP.
быть может это называется кеш?QweЯty писал(а): не первый раз уже правлю htaccess, а изменения начинают работать только после того как я перезапущу оперу пару раз.
.
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
- mr. brightside
- сержант
- Сообщения: 260
- Зарегистрирован: 2010-04-17 17:32:39
- Откуда: Saint-Petersburg
Re: "нормальные" ссылки вместо GET-запросов. PHP.
ах опередил!FreeBSP писал(а):быть может это называется кеш?QweЯty писал(а): не первый раз уже правлю htaccess, а изменения начинают работать только после того как я перезапущу оперу пару раз.
.
я уже гуглил на предмет кеширования .htaccess, как пришло уведомление о новом ответе

Только FreeBSD, только хардкор
- FreeBSP
- майор
- Сообщения: 2020
- Зарегистрирован: 2009-05-24 20:20:19
- Откуда: Москва
Re: "нормальные" ссылки вместо GET-запросов. PHP.
кеширования страниц в опере
хтаксессс перечитывается каждый раз по идее
хтаксессс перечитывается каждый раз по идее
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
вы издеваетесь, да? щаз вот возьму и обижусь, вот прям щаз и начну.
сочетания клавиш ctrl + F5 я давно уже выучил... что в мазиле что в опере...
сочетания клавиш ctrl + F5 я давно уже выучил... что в мазиле что в опере...
- mr. brightside
- сержант
- Сообщения: 260
- Зарегистрирован: 2010-04-17 17:32:39
- Откуда: Saint-Petersburg
Re: "нормальные" ссылки вместо GET-запросов. PHP.
В некоторых CMS-ках есть внутреннее кеширование контента.QweЯty писал(а):вы издеваетесь, да? щаз вот возьму и обижусь, вот прям щаз и начну.
сочетания клавиш ctrl + F5 я давно уже выучил... что в мазиле что в опере...
Может быть ситуация, когда фактически контент обновился, но CMS-ка говорит, что нет. У меня такое было, когда располагал сайт на одном хостинге (не буду показывать пальцем). Необходимо было несколько нажатий F5 или перезагрузка браузера, чтобы увидеть произведенные изменения.
Не знаю, с чем это было связано - может быть с шаблонизатором и он тупо не отрабатывал до какого то момента, может быть с моими кривыми руками, но такое было...
Только FreeBSD, только хардкор
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
ну у меня на втором и третьем виртуалхосте стоит phpbb - но проверил его логи и кеш - моей страницы там нет.
и у меня не цмс, у меня одна единственная страничка index.php
и у меня не цмс, у меня одна единственная страничка index.php

- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
и вообще, я обиженный...пошел воду решетом носить....и дуть в губки)))
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
а как сделать вот так:
то есть цифири после ^rec/ преобразовывались в get rec=цифири
но в логах тока :
Код: Выделить всё
RewriteRule ^rec/([0-9]+)$ index.php?act=3&rec=$1
но в логах тока :
[error] PHP Notice: Undefined index: rec in /www/data/index.php on line 240
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
сделал так:
работать работает...
но без /, а со слешем срабатывает второе условие, а не первое
как сделать проверку на наличие присутствия / в первом правиле, а не писать новое но уже с /
Код: Выделить всё
RewriteRule ^rec/([0-9]+)?$ index.php?act=3&rec=$1 [NC]
RewriteRule ^rec index.php?act=3 [NC,L]
но без /, а со слешем срабатывает второе условие, а не первое

как сделать проверку на наличие присутствия / в первом правиле, а не писать новое но уже с /
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
- QweЯty
- лейтенант
- Сообщения: 796
- Зарегистрирован: 2010-10-12 0:15:15
- Откуда: Таганрог, Калининград
- Контактная информация:
Re: "нормальные" ссылки вместо GET-запросов. PHP.
подскажите в чем прикол может быть?
не могу понять принцип работы...
css класс работает если пишу так:
<a href="#x" class="overlay" id="win3"></a>
а если так:
<a href="#x" class="overlay" id="win3" />
то не работает...
в чем дело то?
разницы по идее нету никакой...
не могу понять принцип работы...
css класс работает если пишу так:
<a href="#x" class="overlay" id="win3"></a>
а если так:
<a href="#x" class="overlay" id="win3" />
то не работает...
в чем дело то?
разницы по идее нету никакой...
- mr. brightside
- сержант
- Сообщения: 260
- Зарегистрирован: 2010-04-17 17:32:39
- Откуда: Saint-Petersburg
Re: "нормальные" ссылки вместо GET-запросов. PHP.
трыньк:QweЯty писал(а):подскажите в чем прикол может быть?
не могу понять принцип работы...
css класс работает если пишу так:
<a href="#x" class="overlay" id="win3"></a>
а если так:
<a href="#x" class="overlay" id="win3" />
то не работает...
в чем дело то?
разницы по идее нету никакой...
Закрывающий тег
Обязателен.
Только FreeBSD, только хардкор