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
Форумы портала PHP.SU :: Версия для печати :: Про ЧПУ и не только.. [8]
Форумы портала PHP.SU » Разное » Обсуждение статей » Про ЧПУ и не только..

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

106. AlexAnder - 16 Июня, 2013 - 15:39:54 - перейти к сообщению
Вроде так делается:

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/Компания и компания
107. BesTime - 15 Июля, 2013 - 02:00:09 - перейти к сообщению
В ответ на это http://example[dot]ru/registration
Выводит этот масив array(1) { [0]=> bool(false) }
что не так?
108. DeepVarvar - 16 Июля, 2013 - 08:55:06 - перейти к сообщению
Много чего может быть не так. Уточни что не так у тебя.
Смотри логи сервера.
Дебаж свой скрипт.
109. xellon - 01 Октября, 2013 - 16:12:36 - перейти к сообщению
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

И вывести

CODE (text):
скопировать код в буфер обмена
  1.  
  2. nav(' $query ');
  3.  

(чтобы вывело file.php
110. esterio - 01 Октября, 2013 - 16:19:01 - перейти к сообщению
1. а вообще-то не стоит цитировать весь пост
2. можно. все зависит от Вашей фантазии
111. ninzzo - 11 Октября, 2013 - 19:25:54 - перейти к сообщению
для простой страницы понятно. site.com/(ТУТ ЛЮБОЙ АДРЕС)

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


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

как тогда делать ?
112. ninzzo - 17 Октября, 2013 - 14:07:53 - перейти к сообщению
кстате если реализовать URL указаным автором способом то он втупую не видит $_GET

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

Не самый удачный пример
114. Squirrel - 20 Октября, 2013 - 12:30:05 - перейти к сообщению
ninzzo пишет:
кстате если реализовать URL указаным автором способом то он втупую не видит $_GET

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

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

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


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


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

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

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



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

спасибо Squirrel
116. Squirrel - 25 Октября, 2013 - 03:54:56 - перейти к сообщению
ninzzo пишет:
спасибо Squirrel

Да не за что. Только советую внимательно почитать статьи по RewriteRule.
А так, чисто намек. Только при условии, что ты используешь два типа ссылок (что в принципе не правильно), то есть на одну и туже страницу ведут ссылки "/aaa" и "/index.php?q=aaa", и необходим _GET, вот тогда, и только тогда нужно делать, как ты написал.
Если хоть одно из условий не требуется, то без [QSA] можно в легкую обойтись.
117. vsbn - 14 Марта, 2015 - 01:01:57 - перейти к сообщению
Добрый день!
Прочитал вашу статью о "Про ЧПУ и не только..". До этого просмотрел в Сети несколько десятков страниц различных сайтов по этой теме. Но на большинстве из них контент скопирован из таких же страниц. Из содержания страниц не трудно понять, что авторы такого контента имеют слабое представление по этой теме, а те, кто имеет некоторое представление, не могут изложить так, чтобы хоть что-то было понятно другим.
В вашей же статье материал о ЧПУ изложен так, что он интересен, доступен для понимания. Очевидно, что вы программист высокого уровня, к тому же обладающий хорошими методическими способностями.
Весь материал, предложенный вами, я проверил на работоспособность. Как бывает в редких случаях, все работает на 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 страницами не используется.
Интересно бы узнать, должно ли это так и быть, или я сделал что-то не так.
Большое вам спасибо.
118. DeepVarvar - 14 Марта, 2015 - 07:39:53 - перейти к сообщению
Да, все корректно.
119. vsbn - 14 Марта, 2015 - 22:38:42 - перейти к сообщению
DeepVarvar пишет:
Да, все корректно.

И вот последнее, о чем забыл упомянуть в предыдущем сообщении.
Интересно было бы узнать, должно ли так и быть, что если в корневом каталоге имеется папка, например: "admin", имя которой совпадает с именем файла страницы, размещенном также в корневом каталоге, например: "admin.php", то при вводе в браузере адреса http://domain[dot]ru/admin/ открывается не страница "admin.php", а страница сервера Apache, отображающая дерево каталогов. Не допустимо, чтобы имя папки и файла совпадало? Или я сделал что-то не так, как нужно?
120. Le0_Nard - 02 Августа, 2015 - 17:57:45 - перейти к сообщению
Сделал, как в первом посте написано. Было 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]/

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

ШТОДЕЛАТЬ?

 

Powered by ExBB FM 1.0 RC1