Страница 1 из 1

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

Добавлено: 2013-06-22 16:54:27
mr. brightside
Добрый день, уважаемые!

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

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

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

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

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

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

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

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

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

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

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

За подсказку буду крайне признателен!

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

Добавлено: 2013-06-22 18:05:27
rmn
mod_rewrite
перенаправляешь все запросы на index.php, а в нем уже сам парсишь $_SERVER['REQUEST_URI']...

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

Добавлено: 2013-06-23 1:06:57
mr. brightside
rmn писал(а):mod_rewrite
перенаправляешь все запросы на index.php, а в нем уже сам парсишь $_SERVER['REQUEST_URI']...
ооо!
большое спасибо!

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

Добавлено: 2013-06-24 9:55:33
QweЯty
о, тоже подобное интересует:
есть с десяток ссылок типа:

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

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?

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

Добавлено: 2013-06-24 10:07:23
mr. brightside
То, что мне помогло понять, как оно работает:

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 я взял оттуда

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

Добавлено: 2013-06-25 22:18:54
QweЯty
такс... сделал по статьям - работает...
тока...
RewriteRule ^rec/ index.php?act=3

отлично переходит на site/rec/ - и отрабатывает что надо...
но если пройти по site/rec - то 404 выползает... ругань на File does not exist
при этом дозаписть / на апаче включена... а вот тут конкретно - она не работает...

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

Добавлено: 2013-06-26 9:22:26
mr. brightside
QweЯty писал(а):такс... сделал по статьям - работает...
тока...
RewriteRule ^rec/ index.php?act=3

отлично переходит на site/rec/ - и отрабатывает что надо...
но если пройти по site/rec - то 404 выползает... ругань на File does not exist
при этом дозаписть / на апаче включена... а вот тут конкретно - она не работает...
а так:

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

RewriteRule ^rec index.php?rec [L]

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

Добавлено: 2013-06-26 9:58:02
QweЯty
а потом сравнивать уже весь массив $_GET['']; ?

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

Добавлено: 2013-06-26 10:07:01
mr. brightside
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

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

Добавлено: 2013-06-26 11:18:26
FreeBSP
я думаю лучше отдельно обрабатывать ^rec& и отдельно ^rec/

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

Добавлено: 2013-06-26 11:39:44
mr. brightside
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/
является правильным

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

Добавлено: 2013-06-26 15:05:31
QweЯty
честно, что то не так с оперой творится...

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

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

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

RewriteRule ^rec index.php?act=3
сейчас - все идеально работает...
хотя вчера не работало.

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

Добавлено: 2013-06-26 15:19:56
QweЯty
то бишь работает в обоих случаях, если ввести site/rec и site/rec/

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

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

.
быть может это называется кеш?

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

Добавлено: 2013-06-26 15:44:57
mr. brightside
FreeBSP писал(а):
QweЯty писал(а): не первый раз уже правлю htaccess, а изменения начинают работать только после того как я перезапущу оперу пару раз.

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

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

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

Добавлено: 2013-06-26 15:57:30
FreeBSP
кеширования страниц в опере
хтаксессс перечитывается каждый раз по идее

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

Добавлено: 2013-06-26 16:21:52
QweЯty
вы издеваетесь, да? щаз вот возьму и обижусь, вот прям щаз и начну.
сочетания клавиш ctrl + F5 я давно уже выучил... что в мазиле что в опере...

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

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

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

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

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

Добавлено: 2013-06-26 16:50:51
QweЯty
ну у меня на втором и третьем виртуалхосте стоит phpbb - но проверил его логи и кеш - моей страницы там нет.
и у меня не цмс, у меня одна единственная страничка index.php :)

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

Добавлено: 2013-06-26 17:01:07
QweЯty
и вообще, я обиженный...пошел воду решетом носить....и дуть в губки)))

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

Добавлено: 2013-07-11 12:37:36
QweЯty
а как сделать вот так:

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

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

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

Добавлено: 2013-07-11 14:49:57
QweЯty
сделал так:

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

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

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

Добавлено: 2013-07-11 15:02:04
QweЯty
исправил :)

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

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

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

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

Обязателен.