Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Блогосфера: продвижение сайта и многое другое" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Сентябрь 2007 → | ||||||
1
|
2
|
|||||
---|---|---|---|---|---|---|
4
|
6
|
7
|
8
|
9
|
||
10
|
12
|
13
|
14
|
15
|
16
|
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
Статистика
0 за неделю
Персональная рассылка WEB-мастера - выпуск номер 7
§ Персональный блог Веб-мастераЗдравствуйте уважаемые читатели!
Сегодня эту рассылку читает уже 205 человек, при том что рассылка открылась, совеем недавно. Это, безусловно, радует и подталкивает меня делать эту рассылку интересней и как можно более полезной и уникальной! Поскольку я не очень понимаю какая аудитория у меня собирается, то ли это веб-мастера, то ли это разработчики и PHP программисты, то ли это просто серферы Интернета – я буду рад, если вы напишите пару строк о себе, возможно вы расскажите мне о том – чего вам не хватает в подобных рассылках, чего бы вы хотели здесь видеть… После того как я получу первые отзывы – я смогу уже более-менее определиться с тематикой рассылки. Ну а сейчас, расскажу вам одну интересную особенность, которая будет интересна, наверное, всем читателям. Что такое ЧПУ и с чем его едят?ЧПУ — термин, принятый среди веб-разработчиков для обозначения WWW—адресов, удобных для восприятия человеком (а также систем и методов построения таких адресов), является аббревиатурой от словосочетания «Человеку Понятный Урл» («урл» — жаргонное для URL). С развитием и ростом Интернета, реальной проблемой стали ситуации, когда веб-сайт содержит страницы с очень длинными трудночитаемыми адресами такими, как http://www.site.net/docs.dll?ext=83465&p1=some&p2=some_another,что крайне сложно запомнить или передать устно. ЧПУ предполагает построение адресов по иерархической схеме, очевидной для человека: вместо http://www.site.net/getnews.dll?y=2006&m=12&d=23 использовать http://www.site.net/news/2006/11/23/. При этом удаление части адреса («укорачивание» адреса на некоторое число секций, разделенных слешами) приводит к попаданию на более высокую ступень навигационной иерархии: http://www.site.net/news/2006/ — новости из 2006 год, http://www.site.net/news/ — список всех новостей и т. п. Одними из первых о ЧПУ в России стали говорить и писать Стас Намин, Дмитрий Котеров и Дмитрий Смирнов. 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 на динамическом сайте:
Рассматривая вышесказанное, можно
догадаться, что оба формата: и динамический, и статический URL должны
содержать в себе всю информацию, необходимую для преобразования в
другой формат. И запомните, что осторожный выбор "дизайна" статических
URL в будущем может уберечь вас от многих проблем, а также уменьшить
количество циклов процессора, которое может сильно вырасти при неумелой
реализации такого преобразования.
Важное предупреждениеВ цели этой статьи не входит объяснение принципов работы регулярных выражений и модуля mod_rewrite. Документация по mod_rewrite и множество других мануалов легко доступны для всех желающих.
А попытка же использовать mod_rewrite без полного ознакомления с этой документацией - первый шаг (а часто и последний) к серьезным проблемам. Запомните, что mod_rewrite
влияет на конфигурацию вашего сервера и достаточно одной опечатки или
логической ошибки, чтобы сделать ваш сайт недоступным для посетителей
или быстро понизить ваши рейтинги в поисковых сервисах. А если ваш
заработок зависит от сайта, то вам тем более необходимо внимательно
изучить всю документацию.
Ниже приведен пример, который можно использовать в качестве основы при построении собственного решения.
Рабочий примерСтарый динамический формат 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 в контейнере <directory> конфигурационного файла httpd.conf, то вам потребуется добавить в регулярные выражения обеих директив RewriteRule слеш (/). Например, придеться изменить "RewriteRule ^index\.php$" на "RewriteRule
^/index\.php$". Также запомните, что вам надо перезапустить сервер, чтобы внесенные изменения в файле конфигурации начали действовать.
Как это работает
Теперь давайте посмотрим, как паук поисковика посетит ваш сайт, используя старый динамический URL:
Размещение правил mod_rewriteЧтобы приведенный код работал надлежащим образом, он должен быть размещен в файле .htaccess в том же каталоге, где и /index.php. Также он может быть помещен в контейнер <directory> в файле httpd.conf, который ссылается на этот каталог.
Регулярные выраженияТут
я приведу только одно замечание по поводу регулярных выражений,
использованных выше. Я избегаю использования очень простых и
популярных, но очень неэффективных конструкций "(.*)/(.*)". Ибо использование множества конструкций ".*" в регулярных выражениях очень неэффективно.
Причины этому две. Первое - ".*" означает "подставить любое число любых символов". И второе - конструкция ".*"
очень "прожорливая", что означает, что в шаблон подставится максимально
возможное количество символов. А это в свою очередь означает, что,
перед тем как запрошенный URL совпадет или не совпадет с регулярным
выражением, произойдет множество подстановок, количество которых равно
(количеству символов между "/" и концом запрашиваемого URL минус 2)
умноженное на (количество "(.*)" минус один). Легко сделать регулярное выражение со множеством "(.*)", разбор которого потребует десятки или даже сотни проходов.
Давайте взглянем на короткий пример. Обратная связь $1 содержит символы, подставляемые в первую "(.*)", а $2 - символы, подставляемые во вторую:
Запрошенный URL: http://example.com/abc/def
Локальный путь: abc/def Шаблон правила: ^(.*)/(.*)$
Я осмелюсь предположить, что множество сайтов проводят каждый год обновление серверов, но эту ошибку оставляют.
Вместо этой конструкции я использую "([^/]+)", "([^&]+)" и "([^\ ]+)".
В грубом переводе они соответственно означают "подставить один или
несколько символов не равных слешу", "подставить один или несколько
символов не равных &" и "подставить один или несколько символов не
равных пробелу". Разница заключается в том, что каждая из этих
конструкций будет "потреблять" один или более символов из запрошенного
URL, увеличивая количество на один, тем самым, позволяя парсеру
регулярных выражений проверить запрошенный URL за один проход
слева-направо.
Частые проблемыСамой
частой проблемой, встречающейся при реализации преобразований URL из
динамических в статические - это когда "ломаются" относительные ссылки
внутри вашей страницы (на изображения, на CSS файлы и внешние
JavaScript). Проблема в том, что клиент (например браузер) сам
обрабатывает относительные ссылки. Например, если вы обрабатываете URL product/widget/blue/fuzzy/widgetco, то браузер увидит страницу "widgetco" и будет обрабатывать относительные ссылки этой страницы относительно "виртуального" каталога /product/widget/blue/fuzzy/.
Есть два простых решения этой проблемы. Первое - это использовать
серверо-относительные ссылки (или абсолютные ссылки), или использовать
дополнительные mod_rewrite правила для
преобразования URL картинок, CSS файлов и т.п. Вот пример использования
серверно-относительной ссылки <img src="/logo.gif">, которая
заменяет странично-относительную ссылку <img src="logo.gif">.
Проблемы при тестированииКак для .htaccess, так и для httpd.conf
перед тестированием любых изменений не забывайте очищать кеш браузера.
Иначе ваш браузер обработает одну из ранее запрошенных страниц из кеша.
Понятно, что в этом случае, новый код не выполнится.
Сперва прочитайте, затем пишите и тестируйтеЯ надеюсь, что эта статья будет полезной. Если после чтения документации о mod_rewrite и регулярных выражений у вас все еще остались проблемы, то спокойно задавайте вопросы на форуме Apache.
Последние записи из моего блога...Новые возможности блога! 2007-08-23Установлен редактор Tiny MCE 2007-08-23 Скоро можно будет скачать движок моего простого блога! 2007-08-23 Движок блога доступен для скачивания! 2007-08-24 Кейворды - полу-интелектуальная система... 2007-08-27 Очередное изменение движка блога! 2007-08-29 Готовится новый модуль блога! 2007-09-02 Безопастность блога увеличена! 2007-09-02 Завоюет ли PHP интернет? 2007-09-03 Яндекс опять ставит палки в колеса! 2007-09-04 Подготовка блога для скачивания 2007-09-07 Notepad2 – лучший инструмент разработчика! 2007-09-08 PHP Expert Editor – еще один интересный редактор. 2007-09-09 |
В избранное | ||