Многофункциональность правил rewrite на Apache

Серверы на Apache имеют очень хорошую и полезную функцию — mod_rewrite. Эту функцию сервера зачастую сравнивают со швейцарским ножом для работы с URL, так как она несет очень важные возможности. Кому-то сегодняшний материал покажется довольно "техническим", но в SEO без этого никак.

  • Изменение URL: запись динамических URL как читаемых, буквенных URL
  • 301 редирект: говорит браузеру или поисковому роботу что страница была перемещена.

Эти возможности очень разные по своим свойствам и несут разные результаты. Функция rewrite справляется с этими задачами в .conf файле сервера, либо в .htaccess файле виртуального сервера.

Как работает функция rewrite?

Это команда, которую вы записываете в один из файлов конфигурации вашего сервера. Многие записывают эту команду в файл .htaccess, который в действительности отвечает лишь за директорию на сервере, где он лежит.

Чтобы применить эту команду для всего сервера полностью, нужно записать эту команду в файл apache2.conf. Однако, если файл .htaccess положить в корень сайта, то он будет работать для всего сайта. Если вы собрались использовать файл .htaccess, то убедитесь в том, что добавили в него директиву AllowOverride.

Каждый запрос браузера к серверу проходит через этот файл. Помните, что при каждом посещении страницы вашего сайта происходит несколько запросов к серверу: один к HTML, один к каждому css файлу, один к каждому файлу Javascript и один к каждой картинке.

Запрошенный URL сравнивается с регулярным выражением, которое является первым параметром mod_rewrite в файле .htaccess. Если они совпадают, то второй параметр в mod_rewrite используется для создания HTML и посылается обратно браузеру. Это не обязательно означает что страница перенаправляется... для этого нужно использовать редирект.

А нужен ли вам вообще редирект? Не торопитесь...

Не путайте 301 редирект с другими решениями URL в SEO. Все они делаются через mod_rewrite и очень, очень похожи, но выполняют разные задачи.

Вы должны использовать 301 редирект когда хотите сказать браузеру или роботу поисковой машины "Этой страницы тут больше нет, иди по этому новому адресу... я недавно ее переместил". Вы:

  • говорите что страницы тут больше нет
  • показываете браузеру или боту ее новый адрес
  • говорите браузеру или боту, что перемещение временное
  • говорите боту, что все что ссылалось на старый адрес страницы должно ссылаться на новый, так как контент остался тот же, его просто переместили.

Если вы используете mod_rewrite для маскировки URL, вы создаете связь URL страниц, которые хотите показать пользователям (в навигации, ссылках в контенте, картах сайта и т. д.) с реальными URL этих страниц, которые не будет видны никому.

Это делается для того, чтобы перевести стандартные URL, которые состоят из ID категорий, продуктов и других параметров, в буквенные URL, состоящие из слов и несущие информацию.

Пример:

/products/details.asp?pid=11623&catid=42

Скорее всего в данном URL категория 42, ID продукта 11623. Текст, адреса картинок и другое хранится в базе данных под номером 11623, а информация по категории хранится в другой таблице. Для того, чтобы вывести заголовок страницы, мета-теги описания и ключевых слов, веб-сервер ищет эти данные в категории под номером 42 в базе данных. Если вы захотите выводить ссылки на другие продукты, то нужно сделать еще запросы к таблицам в базе данных, где они хранятся.

Чтобы сделать эту ссылку более "человечной" она должна выглядеть примерно так:

/products/necklaces/purple-amethyst-necklace-11623

Используя такую ссылку, вы также "вытаскиваете" все параметры страницы из базы данных, но она уже выглядит более логической и информативной. Ссылки вашего сайта выглядят красивыми, да и к тому же включают в себя ключевые слова.

Используете вы .htaccess или просто 404, решение о использовании 301 редиректа принять просто:

  • если вы хотите сообщить поисковику, что страница находится в другом месте, то используйте 301 редирект
  • если вы хотите сделать красивые URL и замаскировать стандартные не следует использовать 301 редирект.

Что происходит с весом ссылок, если не использовать 301 редирект?

Ничего. Вы также продолжаете наращивать ссылочную массу и улучшать внутреннюю перелинковку. До тех пор, пока поисковые боты видят, что наша страница (пример: /products/necklaces/purple-amethyst-necklace-11623 ) до сих пор существует, поисковик получает весь ее контент и придает полный вес ссылке вместе со статусом HTTP 200 (OK).

Синтакс mod_rewrite

Возьмем простой URL:

по правилу - ^oldstuff\.html$ newstuff.html

Проверяем что запрошенная страница oldstuff.html существует. Если существует, то идет перенаправление на страницу newstuff.html для ее генерации и отправки пользователю. Поисковый робот или браузер до сих пор думает, что находится на странице oldstuff.html.

Другие замечания: знак ^ обозначает начало имени страницы, поэтому поисковик не перепутает, скажем страницу reallyoldstuff.html с нашей oldstuff.html. Знак $ обозначает конец имени файла, поэтому бот не перепутает нашу страницу oldstuff.html со страницей oldstuff.htmlly.

Что насчет того слеша в середине? Это первый параметр регулярного выражения, в котором каждый символ должен совпадать с запрошенным. То, что мы ставим за знаком \ называется скрытием символов, т. е. Мы не подразумеваем каждый символ в отдельности, а мы говорим что тут их набор целиком.

Теперь, 301 редирект:

^oldstuff\.html$ newstuff.html [R=301,L]

Это 301 редирект. Это редирект, так как в скобках мы используем R. Это именно 301 редирект, потому что мы после знака равно мы поставили 301, а если бы после знака равно мы ничего не прописали, то это был бы 302 редирект, который означает, что совсем недавно мы переместили страницу и не хотим, чтобы ссылки на нее передавали вес. В 99% случаев вы будете использовать именно 301 редирект, а не 302.

В квадратные скобки заключено два параметра, отделенные запятой. Второй параметр "L" означает Last, то есть последний. Он говорит, что страница в выражении совпадает с запрошенной, и при последующих запросах в .htaccess такую проверку можно будет не делать. В 99% случаев использования 301 редиректа вы будете использовать параметр "L".

В 92% случаев использования операций, не связанных с 301 редиректов вы будете использовать параметр "L". Почему не в 99% случаев?

Иногда бывает полезным использовать несколько правил rewrite к одному URL. Допустим, у вас есть некоторое количество папок, находящихся в первом уровне, с которыми вы хотите проделать операции rewrite.

Также у вас есть несколько вложенных в эти папки папок, с которыми вы хотите проделать эти операции тоже. В первом правиле вы можете заменить имя главной папки, а затем второе правило, которое будет переименовывать вложенные в нее папки.

Исходный URL:

/prods/metal1/necklace-11623.htm

По первому правилу mod_rewrite URL можно поменять /jewelry-products/ вместо /prods/ , поэтому мы получаем:

/jewelry-products/metal17/necklace-11623.htm

По второму правилу мы заменим /gold/ вместо /metal17/:

/jewelry-products/gold/necklace-11623.htm

Скажем у нас есть каталог драгоценностей с ценами и фотографиями названными [product ID].jpg. Такое имя фото очень удобно для программиста и базы данных, но оно совсем не приемлемо для SEO. Вы можете использовать правила rewrite для изменении имени картинок, чтобы поисковые боты “полюбили” наши картинки и взяли в индекс. В нашем случае путь будет следующим:

/images/necklaces/gold/amethyst-11623.jpg
вместо этого:

/images/prods/11623.jpg

Теперь, правило rewrite применяется не только для создания редиректа или преобразования URL.

MyOST: нужно помнить, что 301 редирект и Яндекс - это понятия очень связанные с временем, а точнее, Вы можете прождать 2-3 месяца, пока зеркальщик не почтит визитом сайт, а после еще чуть-чуть времени нужно подождать для апдейта зеркальщика.

Источник: RewriteRule's Split Personality Explained

Перевод: SEOM.info