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 :: Несколько вопросов по mod_rewrite

 PHP.SU

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


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

> Без описания
teddy
Отправлено: 07 Августа, 2013 - 18:46:48
Post Id


Участник


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


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




Здравствуйте. Столкнулся с проблемой в понимании принципа работы mod_rewrite.

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

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

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

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

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

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

Заранее спасибо, надеюсь вы мне поможете )
 
 Top
_Dark_
Отправлено: 07 Августа, 2013 - 19:06:02
Post Id


Частый гость


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


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

[+]


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 для большей гибкости, так что эта проблема сама решится, когда разберетесь с роутингом.

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

 
 Top
teddy
Отправлено: 07 Августа, 2013 - 19:14:16
Post Id


Участник


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


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




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

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

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

Ещё про 301 редирект очень интересно, в теме топика описал проблему
 
 Top
_Dark_
Отправлено: 07 Августа, 2013 - 19:19:52
Post Id


Частый гость


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


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

[+]


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

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

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

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

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

(писал в браузере после целого дня кодинга, мог что-то упустить)

(Отредактировано автором: 07 Августа, 2013 - 19:38:12)

 
 Top
teddy
Отправлено: 07 Августа, 2013 - 19:28:07
Post Id


Участник


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


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




_Dark_
Спасибо, начну сейчас пробовать что то слепить...

Может если есть кому то что то добавить буду очень рад выслушать каждого.
 
 Top
_Dark_
Отправлено: 07 Августа, 2013 - 19:31:42
Post Id


Частый гость


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


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

[+]


Вот новый пример, тот не совсем рабочий и правильный.
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/

Вот вам и ЧПУ.

В общем, я думаю, что вы разберетесь, этот код — и есть, в общем-то, рабочий роутинг Закатив глазки

(Отредактировано автором: 12 Августа, 2013 - 21:47:19)

 
 Top
teddy
Отправлено: 07 Августа, 2013 - 19:49:26
Post Id


Участник


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


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




_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
что бы редирект срабатывал на ЧПУ а не показывал послушно содержимое Улыбка как то так
 
 Top
tuareg
Отправлено: 07 Августа, 2013 - 21:10:37
Post Id


Участник


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


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




А оно так сработает?
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.  
 
 Top
_Dark_
Отправлено: 07 Августа, 2013 - 22:15:05
Post Id


Частый гость


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


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

[+]


tuareg пишет:
А оно так сработает?

А что не так?
 
 Top
tuareg
Отправлено: 07 Августа, 2013 - 22:34:08
Post Id


Участник


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


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




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

Вот я спросил, может версия какая-то другая Улыбка
 
 Top
_Dark_
Отправлено: 07 Августа, 2013 - 22:50:38
Post Id


Частый гость


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


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

[+]


tuareg пишет:
Ну у меня он 5.2 ругается на такое объявление ф-ий

Да, этот код для PHP >= 5.3, в связи с использованием замыканий.
Но там можно указать название функции и вызывать через
.
 
 Top
teddy
Отправлено: 07 Августа, 2013 - 23:53:08
Post Id


Участник


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


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




Выкурил таки по крупице ЧПУ...

Осталось разобраться с 301 редиректом... никто не знает разве как реализовать такую фишку? Растерялся
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB