Карта сайта
Обслуживание компьютеров, ремонт компьютеров, 1С предприятие, обслуживание серверов,создание сайтов, продвижение сайтов, доработка 1С предприятие
О компании | Статьи | SEO | mod_rewrite. Преобразование URL в статические

« Назад « На главную

mod_rewrite. Преобразование URL в статические

Создание с помощью mod_rewrite ссылок "понятных" для поисковиков.

Введение


Один из наиболее частых вопросов, задаваемых на форумах об Apache, звучит так: "Как мне с помощью mod_rewrite преобразовать динамические URL в статические?" Эта статья собирается ответить на этот вопрос, а также прояснить некоторые заблуждения, связанные с этим вопросом.

 


Mod_rewrite не может изменить URL в браузере пользователя


 

 


Первое заблуждение: mod_rewrite нельзя использовать для изменения URL, который видит посетитель в адресной строке своего браузера, за исключением возможности использования внешнего редиректа. Но внешний редирект "оголит" динамический URL поисковику, тем самым полностью нарушит нашу цель. Наша цель в том, чтобы сделать статические URL с помощью внутренних преобразований на сервере, не используя внешнего редиректа клиента.

Также важно понимать, что mod_rewrite работает с URL после того, как сервер получил HTTP запрос и до того, как выполнится скрипт или обработается контент. Таким образом, mod_rewrite может менять путь файла на сервере и переменные, связанные с запрошенным URL, но не может изменить контент, отсылаемый сервером.

Как изменить динамический URL на статический


Вот алгоритм, который надо выполнить для создания статических URL на динамическом сайте:


  • Преобразовать все ссылки на всех страницах сайта в статический формат. Обычно это делается путем изменения базы данных или скрипта, который генерирует данные страницы. В некоторых случаях с этой задачей быстро справляется функция PHP - preg_replace().

  • Добавить в файл httpd.conf или .htaccess правила mod_rewrite для внутреннего преобразования статических URL, которые были запрошены клиентом, в динамический вид, необходимый для вызова скрипта генерации контента.

  • Добавить дополнительный код mod_rewrite для прямых запросов клиента на динамический URL и перенаправлять их (внешним редиректом) на соответствующий статический URL. Для этого используется 301 редирект (”Постоянно перемещен”), который уведомляет поисковики, что вместо старых динамических URL нужно использовать новые статические. Также внешний редирект перенаправляет посетителей, которые пришли на ваш сайт, используя старую динамическую ссылку из своих закладок.


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

Важное предупреждение


В цели этой статьи не входит объяснение принципов работы регулярных выражений и модуля mod_rewrite. Документация по mod_rewrite и множество других мануалов легко доступны для всех желающих.

А попытка же использовать mod_rewrite без полного ознакомления с этой документацией - первый шаг (а часто и последний) к серьезным проблемам. Запомните, что mod_rewrite влияет на конфигурацию вашего сервера и достаточно одной опечатки или логической ошибки, чтобы сделать ваш сайт недоступным для посетителей или быстро понизить ваши рейтинги в поисковых сервисах. А если ваш заработок зависит от сайта, то вам тем более необходимо внимательно изучить всю документацию.

Подробно о регулярных выражения можно прочитать в книге "Освой самостоятельно регулярные выражения", которую можно преобрести в Bolero или в Озоне

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

Рабочий пример


Старый динамический формат URL: index.php?product=widget&color=blue&size=small&texture=fuzzy&maker=widgetco

Новый статический формат URL: /product/widget/blue/small/fuzzy/widgetco

Код mod_rewrite, используемый в .htaccess:

# Запуск mod_rewrite
Options +FollowSymLinks
RewriteEngine on
#
# Внутренние преобразования статических URL в динамические
RewriteRule ^product/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$
/index.php?product=$1&color=$2&size=$3&texture=$4&maker=$5 [L]
#
# Внешний редирект клиента со старых динамических URL на новые статические
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}
/index.php?product=([^&]+)&color=([^&]+)&size=([^&]+)&texture=([^&]+)&maker=([^ ]+) HTTP/
RewriteRule ^index.php$ http://example.com/product/%1/%2/%3/%4/%5? [R=301,L]

Заметьте, что слово "product" всегда присутствует и в статическом, и в динамическом формате. В этом случае mod_rewrite проще определить запросы, где необходимо применять приведенные выше правила. Другие методы, такие как проверка на существование файла, также можно использовать, но они менее эффективны и более подвержены ошибкам сравнения.

Различия между использованием .htaccess и httpd.conf


Если вы будете использовать правила mod_rewrite в контейнере конфигурационного файла httpd.conf, то вам потребуется добавить в регулярные выражения обеих директив RewriteRule слеш (/). Например, придеться изменить "RewriteRule ^index.php$" на "RewriteRule ^/index.php$". Также запомните, что вам надо перезапустить сервер, чтобы внесенные изменения в файле конфигурации начали действовать.

Как это работает



  • Посетитель использует браузер для просмотра одной из ваших страниц

  • Посетитель кликает по ссылке Tiny red furry gizmos by GizmoCorp!

  • С вашего сервера браузер запрашивает виртуальный файл http://example.com/product/gizmo/red/tiny/furry/gizmocorp

  • Вызывается mod_rewrite и первое правило переформировывает запрос в /index.php?product=gizmo&color=red&size=tiny&texture=furry&maker=gizmocorp, вызывая скрипт

  • Ваш скрипт генерирует запрошенную страницу, и сервер отсылает ее обратно браузеру клиента

  • Посетитель кликает на другую ссылку и процесс повторяется


Теперь давайте посмотрим, как паук поисковика посетит ваш сайт, используя старый динамический URL:


  • Паук запрашивает с вашего сервера: http://example.com/index.php?product=wodget&color=green&size=large&texture=smooth&maker=wodgetsinc

  • Вызывается mod_rewrite и второе правило генерирует 301 редирект, информирующий паука, что запрошенная страница была перенесена на URL: http://example.com/product/wodget/green/large/smooth/wodgetsinc

  • Паук отправляет запрос в свою базу адресов, чтобы изменить в ней старый динамический URL на новый, полученный из редиректа.

  • Паук вновь запрашивает страницу, которую он искал, но на этот раз, используя новый статический URL: http://example.com/product/wodget/green/large/smooth/wodgetsinc

  • Вызывается mod_rewrite и первое правило переформировывает запрос в /index.php?product=wodget&color=green&size=large&texture=smooth&maker=wodgetsinc, вызывая скрипт

  • Ваш скрипт сгенерирует запрошенную страницу, и сервер вернет ее обратно поисковому пауку для последующего парсинга и построения поискового индекса

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


Размещение правил mod_rewrite


Чтобы приведенный код работал надлежащим образом, он должен быть размещен в файле .htaccess в том же каталоге, где и /index.php. Также он может быть помещен в контейнер в файле httpd.conf, который ссылается на этот каталог.

Регулярные выражения


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

Причины этому две. Первое - ".*" означает "подставить любое число любых символов". И второе - конструкция ".*" очень "прожорливая", что означает, что в шаблон подставится максимально возможное количество символов. А это в свою очередь означает, что, перед тем как запрошенный URL совпадет или не совпадет с регулярным выражением, произойдет множество подстановок, количество которых равно (количеству символов между "/" и концом запрашиваемого URL минус 2) умноженное на (количество "(.*)" минус один). Легко сделать регулярное выражение со множеством "(.*)", разбор которого потребует десятки или даже сотни проходов.

Давайте взглянем на короткий пример. Обратная связь $1 содержит символы, подставляемые в первую "(.*)", а $2 - символы, подставляемые во вторую:

Запрошенный URL: http://example.com/abc/def
Локальный путь: abc/def
Шаблон правила: ^(.*)/(.*)$

Частые проблемы


Самой частой проблемой, встречающейся при реализации преобразований URL из динамических в статические - это когда "ломаются" относительные ссылки внутри вашей страницы (на изображения, на CSS файлы и внешние JavaScript). Проблема в том, что клиент (например браузер) сам обрабатывает относительные ссылки. Например, если вы обрабатываете URL product/widget/blue/fuzzy/widgetco, то браузер увидит страницу "widgetco" и будет обрабатывать относительные ссылки этой страницы относительно "виртуального" каталога /product/widget/blue/fuzzy/. Есть два простых решения этой проблемы. Первое - это использовать серверо-относительные ссылки (или абсолютные ссылки), или использовать дополнительные mod_rewrite правила для преобразования URL картинок, CSS файлов и т.п. 

Проблемы при тестировании


Как для .htaccess, так и для httpd.conf перед тестированием любых изменений не забывайте очищать кеш браузера. Иначе ваш браузер обработает одну из ранее запрошенных страниц из кеша. Понятно, что в этом случае, новый код не выполнится.

Сперва прочитайте, затем пишите и тестируйте


Я надеюсь, что эта статья будет полезной. Если после чтения документации о mod_rewrite и регулярных выражений у вас все еще остались проблемы, то спокойно задавайте вопросы на форуме Apache.

02 Октябрь 2011 г.



метки:



Вверх

Подписаться на RSS

  • Новости
  • Статьи
  • Разделы статей

    Наши контакты

    +7 922 292-00-34

    +7(343)361-52-00

    Напишите нам через форму!!!

    Быстрая форма связи с нами

     
    Ваше имя?*
    Как с Вами связаться?*
    Опишите вопрос или сообщение*
    Введите код *


    Знаком (*) выделены обязательные поля.
    Каталог интернет ресурсов - ИнфоПитер
    1С Предприятие
    1С Предприятие

    Антивирусная защита, FireWall
    Антивирусная защита, FireWall

    Заправка Samsung/Xerox
    Заправка Samsung/Xerox

    Заправка картриджей Brother
    Заправка картриджей Brother

    Заправка картриджей Epson/Konica Minolta
    Заправка картриджей Epson/Konica Minolta

    Заправка картриджей HP/Canon black
    Заправка картриджей HP/Canon black

    Заправка картриджей HP/Canon color
    Заправка картриджей HP/Canon color

    Заправка картриджей Lexmark
    Заправка картриджей Lexmark

    Информационные услуги
    Информационные услуги

    Монтаж локальной сети
    Монтаж локальной сети

    Монтирование кабель каналов
    Монтирование кабель каналов

    Настройка внутреннего оборудования
    Настройка внутреннего оборудования

    Настройка работоспособности переферийного оборудования
    Настройка работоспособности переферийного оборудования

    Обслуживание компьютеров
    Обслуживание компьютеров

    Обслуживание серверов
    Обслуживание серверов

    Оптимизация веб сайтов
    Оптимизация веб сайтов

    Разовые услуги
    Разовые услуги

    Ремонт
    Ремонт

    Ремонт оргтехники
    Ремонт оргтехники

    Создание веб (WEB) сайтов
    Создание веб (WEB) сайтов


    упвап

    Юридические услуги
    Юридические услуги

    Наверх

    ООО "Бизнес Технологии"© 2010 г.

    Написать автору

    Карта сайта