Реклама

Партнеры

IE6 и IE7 на одном компьютере. Автоматическая очистка input и textarea
Ноя 03

О том кто такой mod_rewrite или как жеж все таки делаются SEF URL-ы

Вопрос, который все чаще возникает, когда люди начинают задумываться о поисковой оптимизации своих ресурсов. В принципе ситуация такова, что поддержка данной функции в ресурсе, считается положительным фактором при ранжировании страницы в выдаче, но не есть обязательным функционалом. Как понятно из сабжа речь пойдет о построении SEF URL-ов (по русски ЧПУ - исторически сложившаяся некорректная транскрипция Человеко Понятные Урлы) на базе модуля mod_rewrite сервера apache.

Итак, рабочая заготовка:

PHP:
  1. RewriteEngine On
  2. Options +FollowSymlinks
  3. RewriteBase /
  4.  
  5. RewriteCond %{THE_REQUEST} [^\s]*/index\.php\?&type=1\ HTTP/
  6. RewriteRule ^index\.php$ http://www.yoursite.com/type/sometype/? [R=301,L]

разберем по порядку:

первый блок собственно включает движ и указывает базовый каталог (RewriteBase) для переадресации, в нашем случае от корня сайта

второе это RewriteCond - условие срабатывания.

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

  • %{THE_REQUEST} - полная строка запроса в том виде, в котором ее присылает браузер посетителя,
  • %{QUERY_STRING} - параметры запроса,
  • %{REMOTE_ADDR} - IP-адрес посетителя,
  • %{REMOTE_HOST} - имя хоста посетителя,
  • %{REMOTE_USER} -имя пользователя, если он прошел авторизацию,
  • %{REMOTE_METHOD} - тип запроса, обычно GET или POST,
  • %{PATH_INFO} - путь к файлу веб-страницы (в файловой системе сервера),
  • %{HTTP_USER_AGENT} - содержимое http-заголовка User-Agent,
  • %{HTTP_REFERER} -содержимое http-заголовка Referer,
  • %{HTTP_COOKIE} - содержимое http-заголовка Cookie,
  • %{HTTP_HOST} - имя хоста веб-сайта,
  • %{TIME_YEAR} - все переменные TIME_* хранят разбитые на части текущие дату и время, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY
  • %{REQUEST_URI} - строка запроса без имени хоста и параметров запроса,
  • %{REQUEST_FILENAME} - имя файла из REQUEST_URI,
  • %{THE_REQUEST} - полная строка запроса в том виде, в котором ее присылает браузер посетителя.
  • Помимо стандартных переменных можно проверять содержимое любого http-заголовка: %{HTTP:Название-Заголовка}.

условие проверки это обычное регулярное выражение стандарта PCRE, помимо всего в условии можно применять следующие макросы (или операторы):

  • -d — должен существовать каталог, имя которого совпадает со значением переменной;
  • -f — должен существовать файл, имя которого совпадает со значением переменной;
  • -s — должен существовать файл ненулевой длины, имя которого совпадает со значением переменной;
  • -l — должен существовать симлинк, имя которого совпадает со значением переменной;
  • -F— должен существовать файл, имя которого совпадает со значением переменной, и этот файл должен быть доступен по внешней ссылке на данный веб-сайт;
  • -U — должна быть доступна http-ссылка, имя которой совпадает со значением переменной.
  • = обозначает лексическое равенство.
  • > лексическое больше.
  • < лексическое меньше.

последняя часть строки условия может содержать следующие флаги:

  • OR применяестя для объединение директив RewriteCond по ИЛИ (по умолчанию подряд идущие условия объединяются по И)
  • NC отключение проверки регистра.

отрицание условия делается знаком !

например:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

эта группа условий означает примерно следующеее: если запрашиваемый пользователем файл не является файлом И не является директорией тогда ...... - вообще это обычная конструкция для проверки существования запрашиваемого пути

теперь о том что же тогда ..........., а тогда у нас идет директива:

RewriteRule - это правило преобразования. Их может быть несколько, при этом все они применяются в порядке их описания. Когда правила заканчиваются, они вновь начинают применяться с самого начала, и этот цикл продолжается до тех пор, пока «срабатывает» хотя бы одно из правил либо не сделана остановка специальными флагами.

Общий вид правила таков: RewriteRule "исходный путь" "замена" "флаги"

"исходный путь" и "замена" - соответственно представляют собой все теже регулярные выражения стандартаPCRE

"исходный путь" - это часть исходной ссылки, от которой отрезаны имя сервера, путь до текущего каталога и параметры запроса. Допустим, что наш веб-сайт www.mysite.com расположен в каталоге /home/docs/site/www/ на сервере. Тогда для ссылки http://www.mysite.com/test/index.html?cat=0 исходным путем в каталоге /home/docs/site/www/ будет test/index.html, а в каталоге /home/docs/site/www/test/ - list.html. Другими словами "исходный путь" зависит от места положения файла .htaccess в котором и записаны правила преобразования. НЕ совпадение исходного пути проверяется как и ранее оператором !

"замена" - это то, на что будет заменена исходная ссылка в случае «срабатывания» правила. Замена может быть относительной (если она не начинается с символа /) и абсолютной (если она начинается с символа / или представляет собой полную ссылку, начинающуюся с http:// или https://). В замене можно использовать определенные части исходного пути, отмеченные круглыми скобками. При этом макрос $1 обозначает ту часть исходного пути, которая расположена внутри первой пары скобок, $2 - внутри второй пары и так далее.

Флаги - это дополнительные опции для данного правила, которые перечисляются в квадратных скобках через запятую. Вот некоторые часто используемые:

  • R (redirect) останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на данную страницу (так 302 - MOVED TEMPORARY). С данным флагом можно указать другой код результата, например "R=301", как в нашем примере, возвратит редирект с кодом 301 - MOVED PERMANENTLY.
  • F (forbidden) возвращает ошибку 403 (FORBIDDEN).
  • G (gone) возвращает ошибку 410 (GONE).
  • P (proxy) - по этому флагу Apache выполняет подзапрос (sub-request) к указанной странице с использованием программного модуля mod_proxy, при этом пользователь ничего не узнает об этом подзапросе. Если модуль mod_proxy не входит в состав вашей сборки Apache, то применение данного флага вызовет ошибку.
  • L (last) останавливает процесс преобразования, и текущая ссылка считается окончательной.Это то что нужно для того чтобы не произошло зацикливания.
  • N (next) запускает процесс преобразования с первого по порядку правила.
  • E (env) устанавливает переменную окружения, например: «E=переменная:значение».

Из всего вышеизложенного видим, что в нашем первом примере происходит так называемое обратное преобразование, которое обычно делается для пауков поисковых систем. Т.е. в базе поисковика хранится старая динамическая ссылка вида http://www.mysite.com/index.php?type=1, а у нас теперь на сайте вместо обычных URL - ов используются ЧПУ, и мы конечно хотим чтобы в базе поисковика были наши новые красивые ЧПУ :) Таким образом мы делаем следующее преобразование запрашиваемого поисковиком УРЛ-а http://www.mysite.com/index.php?type=1 в ЧПУ вида http://www.yoursite.com/type/sometype/ причем делаем это через внешний редирект с кодом 301 - что говорит поисковику о том, что адрес страницы изменился и соответственно у себя в базе он его тоже изменит в соответствии с нашим ЧПУ

Напоследок пример прямого преобразования (собс-но Сабж :)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/somefunc/[^\s]*
RewriteRule ^somefunc/([^/]*)/$ somefunc.php?action=$1 [L]

Делает проверку на сушествование файла и директории запрашиваемого в ЧПУ потом еще проверяет на соответствие маске /somefunc/ и если исходный путь запрашиваемого ресурса соответствует PCRE маске ^somefunc/([^/]*)/$ делаем преобразование запрашиваемого ЧПУ в его обычный динамический вид somefunc.php?action=$1 где в параметр action будет передана часть запрашиваемой строки после somefunc/ Это и есть прямое преобразование, т.е. запрашиваемый ЧПУ http://www.mysite.com/somefunc/actionvalue1/ приводит к внутреннему вызову страницы http://www.mysite.com/somefunc.php?action=actionvalue1

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Есть одно мнение на “О том кто такой mod_rewrite или как жеж все таки делаются SEF URL-ы”

  1. Автор:Zorg

    Полезно, спасибо.

Оставить ответ