Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Про ЧПУ и не только..

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (9): [1] 2 3 4 5 6 7 8 9 »   

> Описание: Малюсенькая статейка.
DeepVarvar Супермодератор
Отправлено: 10 Августа, 2011 - 21:33:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Раз уж решил отписаться - отпишусь.
Как и обещал - простыми словами.

В связи с тем что на форуме участились вопросы по теме ЧПУ, раскрою немного эту тему.

Начнем с того, что же это такое, но с небольшим отступлением.

1. IPv4
Были времена, когда не было доменных имен.
И все сетевые ресурсы были доступны только по прямому обращению по уникальному IP-адресу.
Но ресурсов становилось все больше и больше.
Такое кол-во IP-адресов было трудно запомнить, неудобно хранить..
И люди придумали доменные имена.
Появились DNS-сервера, хранящие данные к какому IP-адресу относится доменное имя.
DNS-сервис можно сравнить с записной книжкой телефона.

Имя - номер..
Имя - номер..
Имя - номер..
Имя - номер..

Не зачем запоминать IP-адрес. Достаточно запомнить доменное имя.
Это ведь ЧЕЛОВЕЧНО Улыбка

2. ЧПУ
Ссылки динамических сайтов изначально выглядели примерно так:

http://site[dot]ru/index.php?cat=news&post=12
http://site[dot]ru/cart.php?block=or[dot][dot][dot]mp;product=65545
http://site[dot]ru/articles.php?rubr[dot][dot][dot];page=8#comments
http://site[dot]ru/registration.php?step=2

Потом кто-то задумался, по аналогии с доменными именами: "А не сделать ли и ссылки внутри сайта красивыми и ЧЕЛОВЕЧНЫМИ?"
Задумался и сделал.. Улыбка

Теперь ссылки стали выглядеть красиво, аккуратно и ЧЕЛОВЕЧНО.

http://site[dot]ru/news/12/
http://site[dot]ru/order/65545/
http://site[dot]ru/articles/657/34/page/8/#comments
http://site[dot]ru/registration/2/

Но это был только первый шаг. Ведь вроде бы для пользователя все красиво и понятно.
А как же программист? Сидеть и раскапывать сотни строчек в файле .htaccess?
Ну уж нет! Увольте! Программисту тоже нужна свобода и удобстно!

3. Единая точка входа
Вот тут и начинается рассказ об удобстве для программиста.
Итак, мы хотим прозрачно и понятно для себя самих получать данные из строки запроса и легко их обрабатывать.
Так поехали. Расскажу только один принцип для примера. Самый простой и понятный.

Мы просто ВООБЩЕ ВСЕ что к нам приходит перенаправим в один единственный файл:

.htaccess:
CODE (html):
скопировать код в буфер обмена
  1. RewriteEngine on
  2. RewriteBase /
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. RewriteCond %{REQUEST_FILENAME} !-f
  5. RewriteRule ^(.*) index.php?q=$1 [L]

Файл index.php будет единственной точкой входа для всех запросов.
Теперь обработаем полученную строку:

index.php:
PHP:
скопировать код в буфер обмена
  1. // вот тут будут наши "части"
  2. $params = array();
  3.  
  4. // получили строку
  5. $query_string = str_replace("q=","",trim($_SERVER['QUERY_STRING']));
  6.  
  7. // на всякий случай декодируем
  8. $query_string = urldecode($query_string);
  9.  
  10. // разбиваем на массив
  11. $query_params = explode("/",$query_string);
  12.  
  13. // и проверяем
  14. // а вдруг в конец слеш не дописали?
  15. // да и почистим сразу от SQL-инъекций
  16. foreach ($query_params as $query_param)
  17.   if ($query_param != "")
  18.     $params[] = mysql_real_escape_string($query_param);
  19.  
  20. // посмотрим что получилось
  21. var_dump($params);


В итоге у вас должно получится следующее:

Запрос: http://site[dot]ru/news/12/
Массив: $params = array("news","12");

Запрос: http://site[dot]ru/order/65545/
Массив: $params = array("order","65545");

Запрос: http://site[dot]ru/articles/657/34/page/8/#comments
Массив: $params = array("articles","657","34","page","8");
(по #comments браузер вообще не будет совершать запрос)

Запрос: http://site[dot]ru/registration/2/
Массив: $params = array("registration","2");

4. Заключение
Когда у вас есть массив параматров,
вы можете использовать его как параметры функций или методов классов.
Например для последнего запроса можно поступить так:
http://site[dot]ru/registration/2/

Берем первый параметр $params[0] (там "registration")
И подключаем файл содержащий код для регистрации.
PHP:
скопировать код в буфер обмена
  1. if (file_exists("modules/".$params[0].".php"))
  2.   require_once("modules/".$params[0].".php");

А сам файл может содержать все что вам надо исключительно для работы с регистрацией пользователей.
Кстати самый смысл в том, что он ведь может обработать и $params[1], скорее даже должен.
Ведь именно для него мы передаем второй параметр.

P.S.
Ну вот на самом деле даже наверное все..
Сильно не бейте - я вообще впервые взял в руки "виртуальное перо".
А вдруг получится написать нормально? Закатив глазки
 
 Top
biperch
Отправлено: 10 Августа, 2011 - 22:39:21
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




по стилю кода вижу что Друпалист писал либо пример из друпала Улыбка
респект
 
 Top
DeepVarvar Супермодератор
Отправлено: 10 Августа, 2011 - 22:40:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




biperch пишет:
Друпалист
Радость
Та я его даже и не знаю, друпала этого....
 
 Top
Arni
Отправлено: 11 Августа, 2011 - 01:24:25
Post Id



Гость


Покинул форум
Сообщений всего: 95
Дата рег-ции: Июль 2011  


Помог: 2 раз(а)




Я бы добавил еще в .htaccess. Так мы сможем отправлять ссылки

http://site[dot]ru/news/12/page[dot]html?var=hi

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. RewriteCond   %{REQUEST_FILENAME}       !-d
  3. RewriteCond   %{REQUEST_FILENAME}       !-f
  4. RewriteRule   ^(.*) index.php?%{QUERY_STRING}
  5.  


Тоисть произвольный GET запрос придет как обычно.

(Отредактировано автором: 11 Августа, 2011 - 01:25:25)

 
 Top
White
Отправлено: 11 Августа, 2011 - 08:51:10
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




написано хорошо, но не раскрыт один достаточно важный аспект.
А нужны ли они на самом деле?
http://site[dot]ru/articles/657/34/page/8/#comments - это человечно? я например не видя полной строки запроса не смогу догадаться что обозначают 657, 34 (с 8 еще куда не шло).
Вопрос скорей не в человечности, а в том, что в далекие времена поисковые роботы тяжело переваривали динамический контент, и как правило он имел достаточно низкий индекс. сейчас же ситуация во многом изменилась.
для примера - на этом форуме нет чпу, но темы с него иногда в течении нескольких часов попадают в топ к гуглу. а если бы робот запутался и глядя на ссылки решил, что это статика? вряд ли бы они так часто индексировались.
П.С. пользователю в конечном итоге все-равно что там в строке запроса, он ее не читает, и не вводит. он жмет по ссылкам, а все остальное его мало волнует.

(Отредактировано автором: 11 Августа, 2011 - 08:51:55)



-----
if(time()>1356048000) die();
 
 Top
illy
Отправлено: 11 Августа, 2011 - 11:38:23
Post Id



Участник


Покинул форум
Сообщений всего: 1117
Дата рег-ции: Июль 2011  
Откуда: от верблюда)


Помог: 28 раз(а)




Короче для тех кто в танке ЧПУ=>Человеко-Понятный УРЛ Ха-ха
УРЛ=>URL=>Uniform Resource Locator=>Универсальный Указатель Ресурса=>Ссылка Хорошо

(Отредактировано автором: 11 Августа, 2011 - 11:41:07)



-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
biperch
Отправлено: 11 Августа, 2011 - 12:24:57
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




DeepVarvar пишет:
biperch пишет:
Друпалист
Радость
Та я его даже и не знаю, друпала этого....


Радость
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Августа, 2011 - 14:44:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




White пишет:
А нужны ли они на самом деле?

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

А уж надо оно или не надо - это другой вопрос..
 
 Top
new01
Отправлено: 11 Августа, 2011 - 15:42:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 301
Дата рег-ции: Июнь 2010  
Откуда: Челябинск


Помог: 1 раз(а)




DeepVarvar, скажите получается лучше сделать файл, который бы обрабатывал все запросы на сайт? Разве не лучше всё прописать в .htaccess? Вы уверены, что крупные компании типа вконтакте делают именно так?
А статья классно получилась. Всё понятно. Побольше бы таких.)
(Добавление)
Да и ещё. Если файл существует к примеру reg.php, то сайт его откроет, холесь бы, чтобы он открыл /reg. Это надо в .htaccess что-то написать? Подскажите пожалуйста!

(Отредактировано автором: 11 Августа, 2011 - 15:45:45)



-----
new01
 
 Top
White
Отправлено: 11 Августа, 2011 - 17:43:09
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)





illy пишет:
ЧПУ=>Человеко-Понятный УРЛ
а я то думал что это числовое программное управление... Однако

(Отредактировано автором: 11 Августа, 2011 - 17:43:32)



-----
if(time()>1356048000) die();
 
 Top
Arni
Отправлено: 11 Августа, 2011 - 18:21:09
Post Id



Гость


Покинул форум
Сообщений всего: 95
Дата рег-ции: Июль 2011  


Помог: 2 раз(а)




new01 пишет:
Вы уверены, что крупные компании типа вконтакте делают именно так?


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

ЧПУ будет, и чем дальше тем больше. И не разработчики это будут решать, а заказчики которые слушают СЕОшников.

(Отредактировано автором: 11 Августа, 2011 - 18:22:19)

 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Августа, 2011 - 20:07:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




new01 пишет:
Если файл существует к примеру reg.php, то сайт его откроет, холесь бы, чтобы он открыл /reg

Нет!!!
Вы нарушаете пункт номер три: Единая точка входа
Структура файлов примерно такова (папка в квадратных скобках и в ней файлы через ---, последние два в корне сайта):

[modules]
--- reg.php
--- login.php
--- news.php
--- и т.д...

index.php
.htaccess

Хтацесс такой как я писал, в индексе так как я писал.
Если обратиться по адресу http://localhost/reg/
Вам заинклюдит автоматом файл reg.php лежащий в папке modules
То же касается и остальных файлов..
 
 Top
new01
Отправлено: 11 Августа, 2011 - 23:19:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 301
Дата рег-ции: Июнь 2010  
Откуда: Челябинск


Помог: 1 раз(а)




DeepVarvar пишет:
Нет!!!
Вы нарушаете пункт номер три: Единая точка входа
Структура файлов примерно такова (папка в квадратных скобках и в ней файлы через ---, последние два в корне сайта):

[modules]
--- reg.php
--- login.php
--- news.php
--- и т.д...

index.php
.htaccess

Хтацесс такой как я писал, в индексе так как я писал.
Если обратиться по адресу http://localhost/reg/
Вам заинклюдит автоматом файл reg.php лежащий в папке modules
То же касается и остальных файлов..

Прям непонятно почему нельзя сделать так
RewriteCond %{REQUEST_FILENAME} !-d #не папка
RewriteCond %{REQUEST_FILENAME} !-f #не файл
Этот код определяет это не папка и не файл. Если условия выполнится, то выполняется следующия строка. Почему нельзя сделать дальше два условия, если это файл или папка,то перенаправлнение на /reg? Непонятно...
(Добавление)
Arni пишет:
В этом вся проблема, каждый махенький сайтик смотрит на большие компании забывая о своем ничтожном предназначении.

ЧПУ будет, и чем дальше тем больше. И не разработчики это будут решать, а заказчики которые слушают СЕОшников.

Не понял вас. Что вы имели в виду? Объясните пожалуйста..
(Добавление)
Ещё почему возникает такая проблема. Есть файл indnex.php.Ввожу site.ru/index/
css стили пропадают.. Опять непонятно


-----
new01
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Августа, 2011 - 08:02:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




new01 пишет:
Почему нельзя сделать дальше два условия

Можно.. Хоть сто условий. На каждое действие для каждого файла.
А потом когда у вас появится в папке модулей еще один файл,
будете добавлять в .htaccess еще строчек..
А когда вы уберете ненужный - будете удалять лишние строчки..

Я же описал как сделать правильнее, когда не надо будет думать что у вас в .htaccess написано. Вам знакомо такие выражение как "расширяемость" и "модульность"?

new01 пишет:
И не разработчики это будут решать, а заказчики которые слушают СЕОшников
Да, есть такая тема. Сеошники кричат что лучше сайт с чпу.
Если им так надо (хочется) - возможность есть. Но мы же это для себя в первую очередь делаем. Им нужен чпу? Ну а мы себе сделаем единую точку входа. Нам же удобнее.
(Добавление)
new01 пишет:
css стили пропадают
Пишите путь от корня - не пропадут.
И непонятно кстати почему вообще пропадают.
Вы не должны фактически переходить в папку с файлом reg,
вы должны оставаться в корне. Файл только инклюдится и начинает выполняться как часть index.php в корне.
Это удобно и к путям стилей и картинок - какой бы путь не был указан в браузере - мы всеравно в корне сайта, только с разными аргументами.
 
 Top
new01
Отправлено: 12 Августа, 2011 - 12:50:25
Post Id



Посетитель


Покинул форум
Сообщений всего: 301
Дата рег-ции: Июнь 2010  
Откуда: Челябинск


Помог: 1 раз(а)




То что пропадают стили - это очень плохо. Путь от корня писать как-то мне не нравится... Надо подумать
Надо сделать так. При вводе reg.php посылать пользователя на страницу с ошибкой 404, где написано "Такой страницы не существует". Как можно это сделать?

(Отредактировано автором: 12 Августа, 2011 - 13:14:23)



-----
new01
 
 Top
Страниц (9): [1] 2 3 4 5 6 7 8 9 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Обсуждение статей »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB