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 :: Версия для печати :: Несколько вопросов по mod_rewrite
Форумы портала PHP.SU » » Вопросы новичков » Несколько вопросов по mod_rewrite

Страниц (1): [1]
 

1. teddy - 07 Августа, 2013 - 18:46:48 - перейти к сообщению
Здравствуйте. Столкнулся с проблемой в понимании принципа работы mod_rewrite.

Статьи читал, но не много не докуриваю я это дело. Если кто может объясните пожалуйста принцип.

Опишу что я конкретно не понимаю:

Спойлер (Отобразить)

И я так понимаю это не универсальный вариант. Как можно грамотно настроить ЧПУ? Что бы на основе title статьи например, формировался ЧПУ. Если можно напишите код чтоб я вбил его у себя и прощупал на примере как это работает.

301 редирект
RewriteRule ^file.php$ anotherfile.php [R=301] - все норм редиректится, но вдруг мне нужно удалять дубли если у меня настроено ЧПУ? Тоесть сайт будет доступен и так site.ru/articles/33 и так site.ru/index.php?articles=33

С точки зрения поисковиков это не есть хорошо. Поэтому думаю надо сделать 301 редирект с программных ссылок на ЧПУ ссылки. Это что каждый раз ручками нужно будет для всеъ случаев менять .htaccess? Не думаю... Хотелось бы получить грамотное объяснение как решить эти две задачи, желательно с примерами.

Заранее спасибо, надеюсь вы мне поможете )
2. _Dark_ - 07 Августа, 2013 - 19:06:02 - перейти к сообщению
teddy пишет:
CODE (htmlphp):
скопировать код в буфер обмена
  1. RewriteRule ^(.*) index.php?q=$1 [L]


^(.*) значит "всё", это регулярное выражение.
$1 — это ссылка на эту маску, т.е. в $1 попадёт то, что подходит под выражение (.*), т.е., как я сказал выше, всё.

!-f и !-d значит, что выражение должно выпоняться только для того пути, который не является путем к файлу (!-file) или директории (!-dir). Восклицательный знак — это, как обычно, отрицание, нужно для того, чтобы пути к изображениям или файлам проходили напрямую, не через PHP.
(Добавление)
teddy пишет:
И я так понимаю это не универсальный вариант. Как можно грамотно настроить ЧПУ? Что бы на основе title статьи например, формировался ЧПУ. Если можно напишите код чтоб я вбил его у себя и прощупал на примере как это работает.

Это универсальный вариант для систем с единой точкой входа.
Это правильный вариант, а ЧПУ вы должны делать уже через PHP.
Вам нужно смотреть на роутинг запросов.
Т.к. через mod_rewrite все запросы перенаправляются на index.php, то, например, при запросе http://site.ru/news/12 в $_GET['q'] будет /news/12.

Соответственно, в самом PHP вы должны при помощи регулярных выражений выполнить роутинг этого адреса.
Например, чтобы получить из адреса /news/12 ID новости (12) вам понадобится регулярное выражение типа news/([0-9]+).

Насчет редеректов не понял, что вы имели в виду, но ЧПУ должно делаться через PHP для большей гибкости, так что эта проблема сама решится, когда разберетесь с роутингом.
3. teddy - 07 Августа, 2013 - 19:14:16 - перейти к сообщению
_Dark_ пишет:
$1 — это ссылка на эту маску, т.е. в $1 попадёт то, что подходит под выражение (.*)

А что будет, если к примеру использовать $2 вместо $1 ? Эти цифры как то отличаются или есть только такое понятие как $1 ? т.к в регэксп $ означает конец строки, поэтому не очень понятно что означает единичка... Почему - описал чуть выше...

А пример можете рабочий показать? Чтоб так скопировать и все работало? Дабы прощупать это дело...

Ещё про 301 редирект очень интересно, в теме топика описал проблему
4. _Dark_ - 07 Августа, 2013 - 19:19:52 - перейти к сообщению
teddy пишет:
А что будет, если к примеру использовать $2 вместо $1 ? Эти цифры как то отличаются или есть только такое понятие как $1 ? т.к в регэксп $ означает конец строки, поэтому не очень понятно что означает единичка... Почему - описал чуть выше...

http://www.php.net/manual/ru/reg....subpatterns.php
Это из этой серии. Цифра означает порядковый номер маски, это не конец строки, в данном случае.

И я свой пост дополнил про 301 редирект.
(Добавление)
А пример...
Какой пример?

Ну, вот, смотрите, простой пример:

(удалено, ниже новый улучшенный пример)

(писал в браузере после целого дня кодинга, мог что-то упустить)
5. teddy - 07 Августа, 2013 - 19:28:07 - перейти к сообщению
_Dark_
Спасибо, начну сейчас пробовать что то слепить...

Может если есть кому то что то добавить буду очень рад выслушать каждого.
6. _Dark_ - 07 Августа, 2013 - 19:31:42 - перейти к сообщению
Вот новый пример, тот не совсем рабочий и правильный.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // Получаем запрашиваем адрес и удаляем из него слэш, который будет в начале и может быть в конце
  3. $uri = trim($_GET['q'], '/');
  4.  
  5. // Правила роутинга, при совпадении будет вызвана соответствующая функция с одним аргументом — смотрите второй адрес
  6. $routes = array(
  7.         'firstaddr' => function() { echo 'This is a callback for /firstaddr'; },
  8.         'news/read/([0-9]+)' => function($params) { var_dump($params); },
  9.         '' => function() { echo 'Default callback'; } // Страница по умолчанию (она же главная). Это правило выполнится в случае, если не подошло ни одно другое правило, так что должно быть всегда самым последним
  10. );
  11.  
  12. foreach($routes AS $route => $callback)
  13. {
  14.         $matches = array();
  15.         if (preg_match("#$route#", $uri, $matches)) {
  16.                 $callback($matches);
  17.                 break; // break необходим, т.к. для правила по умолчанию ('') подходит любой адрес
  18.         }
  19. }


Попробуйте зайти на сайт введя:
http://site[dot]ru/firstaddr
http://site[dot]ru/news/read/123
http://site[dot]ru/news/read/incorrect (такого адреса нет — откроется главная страница без всяких 301 редиректов)
http://site[dot]ru/

Вот вам и ЧПУ.

В общем, я думаю, что вы разберетесь, этот код — и есть, в общем-то, рабочий роутинг Закатив глазки
7. teddy - 07 Августа, 2013 - 19:49:26 - перейти к сообщению
_Dark_ пишет:
Насчет редеректов не понял, что вы имели в виду

К примеру если мы сделали ЧПУ, site.ru/news/12 то он же будет доступен и по адресу site.ru/index.php?news=12

Мне надо сделать так, что бы при запросе site.ru/index.php?news=12 происходил 301 редирект на site.ru/news/12 для того что бы удалить дубли и данная страница была доступна уже только по site.ru/news/12 и при попытке ввести site.ru/index.php?news=12
что бы редирект срабатывал на ЧПУ а не показывал послушно содержимое Улыбка как то так
8. tuareg - 07 Августа, 2013 - 21:10:37 - перейти к сообщению
А оно так сработает?
PHP:
скопировать код в буфер обмена
  1.  
  2. $routes = array(
  3.         'firstaddr' => function() { echo 'This is a callback for /firstaddr'; },
  4.         'news/read/([0-9]+)' => function($params) { var_dump($params); },
  5.         '' => function() { echo 'Default callback'; } // Страница по умолчанию (она же главная). Это правило выполнится в случае, если не подошло ни одно другое правило, так что должно быть всегда самым последним
  6. );
  7.  
9. _Dark_ - 07 Августа, 2013 - 22:15:05 - перейти к сообщению
tuareg пишет:
А оно так сработает?

А что не так?
10. tuareg - 07 Августа, 2013 - 22:34:08 - перейти к сообщению
Ну у меня он 5.2 ругается на такое объявление ф-ий
PHP:
скопировать код в буфер обмена
  1.  
  2.         'firstaddr' => function() { echo 'This is a callback for /firstaddr'; },
  3.  

Вот я спросил, может версия какая-то другая Улыбка
11. _Dark_ - 07 Августа, 2013 - 22:50:38 - перейти к сообщению
tuareg пишет:
Ну у меня он 5.2 ругается на такое объявление ф-ий

Да, этот код для PHP >= 5.3, в связи с использованием замыканий.
Но там можно указать название функции и вызывать через
.
12. teddy - 07 Августа, 2013 - 23:53:08 - перейти к сообщению
Выкурил таки по крупице ЧПУ...

Осталось разобраться с 301 редиректом... никто не знает разве как реализовать такую фишку? Растерялся

 

Powered by ExBB FM 1.0 RC1