ЧПУ на базе mod_rewrite или как делаются SEF URL-ы
Написал: admin в категорию SEO, Программирование, tags: Apache, mod_rewrite, SEF URL, Программирование, ЧПУВопрос, который все чаще возникает, когда люди начинают задумываться о поисковой оптимизации своих ресурсов. В принципе ситуация такова, что поддержка данной функции в ресурсе, считается положительным фактором при ранжировании страницы в выдаче, но не есть обязательным функционалом. Как понятно из сабжа речь пойдет о построении SEF URL-ов (по русски ЧПУ - исторически сложившаяся некорректная транскрипция Человеко Понятные Урлы) на базе модуля mod_rewrite сервера apache.
Итак, рабочая заготовка:
RewriteEngine On
Options +FollowSymlinks
RewriteBase /
RewriteCond %{THE_REQUEST} [^\s]*/index\.php\?&type=1\ HTTP/
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


Записи (RSS)