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 :: Про ЧПУ и не только.. [8]

 PHP.SU

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


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

> Описание: Малюсенькая статейка.
AlexAnder
Отправлено: 16 Июня, 2013 - 15:39:54
Post Id



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


Покинул форум
Сообщений всего: 915
Дата рег-ции: Авг. 2012  
Откуда: Россия


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




Вроде так делается:

REQUEST_URI: пишет:
http://test1.ru/company/Компания%20и%20компания


.htaccess: пишет:
RewriteRule company/.+? index.php [L] #насчёт флага не уверен ;(


.index.php пишет:
PHP:
скопировать код в буфер обмена
  1. echo $_SERVER['REQUEST_URI'];
  2. echo '<br>';
  3. echo urldecode($_SERVER['REQUEST_URI']);


RESPONE пишет:
/company/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B8%20%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F
/company/Компания и компания

(Отредактировано автором: 16 Июня, 2013 - 15:47:07)



-----
Оказывается, недостаточно читать справочники, чтобы правильно писать коды. sadex ©

Форумы стали местом обучения программированию, а не решения трудных вопросов. KingStar ©
 
 Top
BesTime
Отправлено: 15 Июля, 2013 - 02:00:09
Post Id



Гость


Покинул форум
Сообщений всего: 82
Дата рег-ции: Февр. 2012  


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

[+]


В ответ на это http://example[dot]ru/registration
Выводит этот масив array(1) { [0]=> bool(false) }
что не так?


Отредактировано модератором: Мелкий, 15 Июля, 2013 - 09:47:31
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Июля, 2013 - 08:55:06
Post Id



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


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


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




Много чего может быть не так. Уточни что не так у тебя.
Смотри логи сервера.
Дебаж свой скрипт.
 
 Top
xellon
Отправлено: 01 Октября, 2013 - 16:12:36
Post Id


Новичок


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


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




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

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

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

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.
Ну вот на самом деле даже наверное все..
Сильно не бейте - я вообще впервые взял в руки "виртуальное перо".
А вдруг получится написать нормально? Закатив глазки

А можно как - то без массива? Ну, например, мне нужно считать просто УРЛ
http://site[dot]ru/mail

И вывести


(чтобы вывело file.php
 
 Top
esterio
Отправлено: 01 Октября, 2013 - 16:19:01
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




1. а вообще-то не стоит цитировать весь пост
2. можно. все зависит от Вашей фантазии
 
 Top
ninzzo
Отправлено: 11 Октября, 2013 - 19:25:54
Post Id


Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Март 2013  


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




для простой страницы понятно. site.com/(ТУТ ЛЮБОЙ АДРЕС)

PHP:
скопировать код в буфер обмена
  1. if (file_exists("modules/".$params[0].".php"))
  2.   require_once("modules/".$params[0].".php");


а как быть если я перехожу на site.com/catalog/perviy/page1

как тогда делать ?
 
 Top
ninzzo
Отправлено: 17 Октября, 2013 - 14:07:53
Post Id


Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Март 2013  


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




кстате если реализовать URL указаным автором способом то он втупую не видит $_GET

Вот попробуйте. Мне кажется этот способ устаревшим. Слишком много непоняток. Из на wordpress и на joomla 100% урлы сделаны по другому.
 
 Top
esterio
Отправлено: 17 Октября, 2013 - 14:13:01
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




ninzzo пишет:
Слишком много непоняток. Из на wordpress и на joomla 100% урлы сделаны по другому.

Не самый удачный пример
 
 Top
Squirrel
Отправлено: 20 Октября, 2013 - 12:30:05
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


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

[+]


ninzzo пишет:
кстате если реализовать URL указаным автором способом то он втупую не видит $_GET

Аффтор тупо "отреврайтил" чей-то "отреврайченный" текст. В процессе "реврайтов" кто-то потерял флаг QSA и знак доллара в 5й строке. В прочем как и сам смысл такого "ЧПУ".

ninzzo пишет:
Мне кажется этот способ устаревшим. Слишком много непоняток.

Он не устаревший. Он изначально крив и не нужен. И зря ты камень кинул в этот огород. На этом форуме такая ЧПУ считается гуру единственно правильной. А остальными тупо копируется, без понимания смысла.
 
 Top
ninzzo
Отправлено: 24 Октября, 2013 - 20:45:36
Post Id


Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Март 2013  


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




Цитата:
Цитата:
кстате если реализовать URL указаным автором способом то он втупую не видит $_GET


Аффтор тупо "отреврайтил" чей-то "отреврайченный" текст. В процессе "реврайтов" кто-то потерял флаг QSA и знак доллара в 5й строке. В прочем как и сам смысл такого "ЧПУ".


ребят но как быть с $_GET ???

ведь если я захожу на сайт site.com/1?kod=123 то данным способом мой kod=123 не видно через GET. $_GET вообще не существует. В htaccess его затирает.

как быть? Что ни кто не сталкивался ? помогите=(



разобрался. нужно в htaccess сделать так - "RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]"

спасибо Squirrel

(Отредактировано автором: 24 Октября, 2013 - 21:24:33)

 
 Top
Squirrel
Отправлено: 25 Октября, 2013 - 03:54:56
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


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

[+]


ninzzo пишет:
спасибо Squirrel

Да не за что. Только советую внимательно почитать статьи по RewriteRule.
А так, чисто намек. Только при условии, что ты используешь два типа ссылок (что в принципе не правильно), то есть на одну и туже страницу ведут ссылки "/aaa" и "/index.php?q=aaa", и необходим _GET, вот тогда, и только тогда нужно делать, как ты написал.
Если хоть одно из условий не требуется, то без [QSA] можно в легкую обойтись.
 
 Top
vsbn
Отправлено: 14 Марта, 2015 - 01:01:57
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Нояб. 2013  


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




Добрый день!
Прочитал вашу статью о "Про ЧПУ и не только..". До этого просмотрел в Сети несколько десятков страниц различных сайтов по этой теме. Но на большинстве из них контент скопирован из таких же страниц. Из содержания страниц не трудно понять, что авторы такого контента имеют слабое представление по этой теме, а те, кто имеет некоторое представление, не могут изложить так, чтобы хоть что-то было понятно другим.
В вашей же статье материал о ЧПУ изложен так, что он интересен, доступен для понимания. Очевидно, что вы программист высокого уровня, к тому же обладающий хорошими методическими способностями.
Весь материал, предложенный вами, я проверил на работоспособность. Как бывает в редких случаях, все работает на 100%.
На моем сайте скрипт в файле index.php был написан для использования адресов вида:
http://domain[dot]ru/?pg=page
После того, как создал по вашему примеру файл .htaccess, а в файле index.php применил строки из приведенного вами скрипта, стало возможным использовать адреса вида:
http://domain[dot]ru/page/
Во избежании недовольства поисковых роботов, в файле index.php оставил и прежние строки скрипта, сформировав условие, позволяющее альтернативно использовать и адреса прежнего вида:
http://domain[dot]ru/?pg=page
В карте сайта изменил старые ссылки на новые. Прошло недели две после загрузки на сервер обновленных файлов. Вчера проверил индексацию страниц. Google изменил старые ссылки страниц моего сайта на новые. Позиции страниц в поисковике даже повысилась.
Единственное, что привело к затрате времени после перехода на предложенную вами технологию, это пришлось в страницы сайта, на которых имеются рисунки, внести изменения, к примеру:
src="images/link.gif" изменить на src="/images/link.gif"
то есть, перед именем папки images добавить слеш, иначе рисунки не отображаются.
А также в теге файла header.php:
link rel="stylesheet" type="text/css" href="style.css"
изменить style.css на /style.css, то есть добавить слеш. Иначе style.css страницами не используется.
Интересно бы узнать, должно ли это так и быть, или я сделал что-то не так.
Большое вам спасибо.
 
 Top
DeepVarvar Супермодератор
Отправлено: 14 Марта, 2015 - 07:39:53
Post Id



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


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


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




Да, все корректно.
 
 Top
vsbn
Отправлено: 14 Марта, 2015 - 22:38:42
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Нояб. 2013  


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




DeepVarvar пишет:
Да, все корректно.

И вот последнее, о чем забыл упомянуть в предыдущем сообщении.
Интересно было бы узнать, должно ли так и быть, что если в корневом каталоге имеется папка, например: "admin", имя которой совпадает с именем файла страницы, размещенном также в корневом каталоге, например: "admin.php", то при вводе в браузере адреса http://domain[dot]ru/admin/ открывается не страница "admin.php", а страница сервера Apache, отображающая дерево каталогов. Не допустимо, чтобы имя папки и файла совпадало? Или я сделал что-то не так, как нужно?

(Отредактировано автором: 14 Марта, 2015 - 22:58:07)

 
 Top
Le0_Nard
Отправлено: 02 Августа, 2015 - 17:57:45
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Март 2015  
Откуда: Минск, Беларусь


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




Сделал, как в первом посте написано. Было example.com/[page].php?action=[action]&id=[id]. Стало example.com/[page]/[action]/[id].

index.php
PHP:
скопировать код в буфер обмена
  1. //после разбивания запроса на части
  2. require_once('php/head.php');
  3. if($parts[0]==='[page]'){require_once('[page].php');}


[page].php
PHP:
скопировать код в буфер обмена
  1. if($parts[1]==='[action]'){require_once('php/[action].php');}


В [action].php из БД читаются данные строки с id=$parts[2], происходит магия, и все выводится.

В чем проблема:
Все файлы, которые включаются в php/head.php (css/*.css и js/*.js) почему-то ищутся в папке example.com/page/, КОТОРОЙ НЕТ! Почему-то require_once не выдает ошибок, а вот в консоли гуглхрома - 404:failed to load the source. И вместо вывода пустота.

Если адрес example.com/[page]/[action]/[id]/[subjectId]/[do], то файлы ищутся в папке example.com/[page]/[action]/[id]/

Все, что в квадратных скобках - скажем так, подстановочные значения.

ШТОДЕЛАТЬ?
 
 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