"нормальные" ссылки вместо GET-запросов. PHP.

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

"нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение mr. brightside » 2013-06-22 16:54:27

Добрый день, уважаемые!

Я новичок в PHP, поэтому прошу сильно не пинать.

Несмотря на то, что на php пишу недавно, я уже успел слепить пару сайтов. Сайты простые, для них написал свои CMS, которые тоже ничем выдающимся не выделяются:

- Есть главный контроллер index.php в корне сайта, который рулит всем
- Есть база данных, в которой я храню и контент и регистрационные данные пользователей

Так как сайты до боли простые, то этого вполне достаточно.

Однако, меня давно волнует одна проблема, которую я никак не могу решить

В пределах моего сайта все переходы осуществляются с помощью таких вот ссылок:

site/?category?page=pageName - т.е. через обычный GET-запрос.

Далее, мой обработчик смотрит, какая категория (category) у статьи, какая статья (page) и выводит мне нужную запись из БД.

Я хочу переделать такое поведение и получить нормальные ссылки, вида site/category/pageName.

Однако, я не хочу плодить директории (category) в папке сайта или файлы (pageName), хочу, чтобы всё также продолжало храниться в БД, но выводилось красиво.

Можно ли это как-нибудь решить? через getcwd() или реферрер, я не знаю...

За подсказку буду крайне признателен!
Только FreeBSD, только хардкор

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.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/

rmn
старшина
Сообщения: 427
Зарегистрирован: 2008-10-03 18:52:02

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение rmn » 2013-06-22 18:05:27

mod_rewrite
перенаправляешь все запросы на index.php, а в нем уже сам парсишь $_SERVER['REQUEST_URI']...

Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение mr. brightside » 2013-06-23 1:06:57

rmn писал(а):mod_rewrite
перенаправляешь все запросы на index.php, а в нем уже сам парсишь $_SERVER['REQUEST_URI']...
ооо!
большое спасибо!
Только FreeBSD, только хардкор

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-06-24 9:55:33

о, тоже подобное интересует:
есть с десяток ссылок типа:

Код: Выделить всё

site/index.php?act=1
 site/index.php?act=2

 site/index.php?act=10
как в mod_rewrite их переделать в вид:

Код: Выделить всё

site/name
site/xxx
...
site/yyy
как то сделал, теперь с site/name переходит на site/index.php?act=1 но отображается все равно site/index.php?act=1 а не site/name
а как сделать чтобы и отображаелось как site/name?
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение mr. brightside » 2013-06-24 10:07:23

То, что мне помогло понять, как оно работает:

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>
Есди же надо передавать несколько параметров - пишет соответствующую регулярку и добавляем параметро $2.

Кроме того, рекомендуется использовать:

Код: Выделить всё

<FilesMatch "\.inc$">
  Order allow,deny
</FilesMatch>

Options -Indexes
Первый блок <FilesMatch> исключит из вывода файлы с нужным нам расширением.

параметр Options запретит листинг директорий браузером и будет выплевывать Forbidden.

Для того, чтобы заработало Options необходимо, чтобы в Апаче было разрешено AllowOverride On.

Да, еще очень классный .htaccess у Drupal. Большую часть своего .htaccess я взял оттуда
Только FreeBSD, только хардкор

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-06-25 22:18:54

такс... сделал по статьям - работает...
тока...
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.

Непрочитанное сообщение mr. brightside » 2013-06-26 9:22:26

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
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-06-26 9:58:02

а потом сравнивать уже весь массив $_GET['']; ?
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение mr. brightside » 2013-06-26 10:07:01

QweЯty писал(а):а потом сравнивать уже весь массив $_GET['']; ?
хм, да, это менее удобно, особенно, если GET'ов много - надо будет добавлять на каждый новый вид GET-запроса свой блок обработки.

Однако, такой подход реализован в движке на файлах mqblog. Там GET/POST запросы, а также массив COOKIES раскидывается блоками вида:

Код: Выделить всё

foreach($_GET as $k => $v)  {
	$_v[$k] = $v;
}
А потом подключается нужная форма.

Т.е., если у нас GET-запрос вида index.php?action=login, то на выходе мы получим GET["action"] со значением login.

Дальше обработчик ищет папку action и в ней файлик login. Подключает его и выполняет то, что есть в этом файлике.

Не знаю, вдруг такой подход окажется удобным.

Вероятно, есть возможность получить нужное на уровне апача и .htaccess, но я пока не знаю, как решить :-D
Только FreeBSD, только хардкор

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение FreeBSP » 2013-06-26 11:18:26

я думаю лучше отдельно обрабатывать ^rec& и отдельно ^rec/
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение mr. brightside » 2013-06-26 11:39:44

QweЯty писал(а):такс... сделал по статьям - работает...
тока...
RewriteRule ^rec/ index.php?act=3

отлично переходит на site/rec/ - и отрабатывает что надо...
но если пройти по site/rec - то 404 выползает... ругань на File does not exist
при этом дозаписть / на апаче включена... а вот тут конкретно - она не работает...
так а запрос вида site/rec/ и должен отличаться от site/rec, т.е. за слешем в запросе site/rec/ и должен передаваться параметр act=$1, а запрос вида site/rec - это то же самое, что index.php?rec без передаваемого параметра, поэтому это два разных запроса. Вероятно, совет:
FreeBSP писал(а):я думаю лучше отдельно обрабатывать ^rec& и отдельно ^rec/
является правильным
Только FreeBSD, только хардкор

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-06-26 15:05:31

честно, что то не так с оперой творится...

не первый раз уже правлю htaccess, а изменения начинают работать только после того как я перезапущу оперу пару раз.

все работает вот так, вернее вчера оставил после попыток заставить нормально работать:

Код: Выделить всё

RewriteRule ^rec index.php?act=3
сейчас - все идеально работает...
хотя вчера не работало.
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-06-26 15:19:56

то бишь работает в обоих случаях, если ввести site/rec и site/rec/
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение FreeBSP » 2013-06-26 15:42:24

QweЯty писал(а): не первый раз уже правлю htaccess, а изменения начинают работать только после того как я перезапущу оперу пару раз.

.
быть может это называется кеш?
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение mr. brightside » 2013-06-26 15:44:57

FreeBSP писал(а):
QweЯty писал(а): не первый раз уже правлю htaccess, а изменения начинают работать только после того как я перезапущу оперу пару раз.

.
быть может это называется кеш?
ах опередил!

я уже гуглил на предмет кеширования .htaccess, как пришло уведомление о новом ответе =)
Только FreeBSD, только хардкор

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение FreeBSP » 2013-06-26 15:57:30

кеширования страниц в опере
хтаксессс перечитывается каждый раз по идее
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-06-26 16:21:52

вы издеваетесь, да? щаз вот возьму и обижусь, вот прям щаз и начну.
сочетания клавиш ctrl + F5 я давно уже выучил... что в мазиле что в опере...
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение mr. brightside » 2013-06-26 16:29:01

QweЯty писал(а):вы издеваетесь, да? щаз вот возьму и обижусь, вот прям щаз и начну.
сочетания клавиш ctrl + F5 я давно уже выучил... что в мазиле что в опере...
В некоторых CMS-ках есть внутреннее кеширование контента.

Может быть ситуация, когда фактически контент обновился, но CMS-ка говорит, что нет. У меня такое было, когда располагал сайт на одном хостинге (не буду показывать пальцем). Необходимо было несколько нажатий F5 или перезагрузка браузера, чтобы увидеть произведенные изменения.

Не знаю, с чем это было связано - может быть с шаблонизатором и он тупо не отрабатывал до какого то момента, может быть с моими кривыми руками, но такое было...
Только FreeBSD, только хардкор

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-06-26 16:50:51

ну у меня на втором и третьем виртуалхосте стоит phpbb - но проверил его логи и кеш - моей страницы там нет.
и у меня не цмс, у меня одна единственная страничка index.php :)
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-06-26 17:01:07

и вообще, я обиженный...пошел воду решетом носить....и дуть в губки)))
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-07-11 12:37:36

а как сделать вот так:

Код: Выделить всё

RewriteRule ^rec/([0-9]+)$ index.php?act=3&rec=$1
то есть цифири после ^rec/ преобразовывались в get rec=цифири
но в логах тока :
[error] PHP Notice: Undefined index: rec in /www/data/index.php on line 240
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-07-11 14:49:57

сделал так:

Код: Выделить всё

RewriteRule ^rec/([0-9]+)?$ index.php?act=3&rec=$1 [NC]
RewriteRule ^rec index.php?act=3 [NC,L]
работать работает...
но без /, а со слешем срабатывает второе условие, а не первое :(
как сделать проверку на наличие присутствия / в первом правиле, а не писать новое но уже с /
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-07-11 15:02:04

исправил :)
Инженер не смотрит порно. Он ведет расчет бабы на усталость © Федор Сумкин
Изображение

Аватара пользователя
QweЯty
лейтенант
Сообщения: 792
Зарегистрирован: 2010-10-12 0:15:15
Откуда: Таганрог, Калининград
Контактная информация:

Re: "нормальные" ссылки вместо GET-запросов. PHP.

Непрочитанное сообщение QweЯty » 2013-07-23 23:07:23

подскажите в чем прикол может быть?
не могу понять принцип работы...
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.

Непрочитанное сообщение mr. brightside » 2013-07-25 23:25:25

QweЯty писал(а):подскажите в чем прикол может быть?
не могу понять принцип работы...
css класс работает если пишу так:
<a href="#x" class="overlay" id="win3"></a>
а если так:
<a href="#x" class="overlay" id="win3" />
то не работает...
в чем дело то?
разницы по идее нету никакой...
трыньк:
Закрывающий тег

Обязателен.
Только FreeBSD, только хардкор