Страница 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/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
при этом дозаписть / на апаче включена... а вот тут конкретно - она не работает...
а так:
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, но я пока не знаю, как решить

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, а изменения начинают работать только после того как я перезапущу оперу пару раз.
все работает вот так, вернее вчера оставил после попыток заставить нормально работать:
сейчас - все идеально работает...
хотя вчера не работало.
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" />
то не работает...
в чем дело то?
разницы по идее нету никакой...
трыньк:
Закрывающий тег
Обязателен.