Mod rewrite setup Как включить mod_rewrite в любой ОС? Проблемы с.htaccess Установка apache mod rewrite.

Данный модуль веб-сервера Apache предназначен для преобразования исходных URL"ов. Его возможности - колоссальны, но зачастую он используется для создания ЧПУ (Человеко Понятный УРЛ). Что это значит. Вместо использовать http://example.com/2005/12/31/theme.html . Такой механизм очень часто применяется на новостных сайтах. В тоже время это плюс для безопасности. Пользователи не видят, к какому файлу (скрипту) реально идет обращение.

Ниже рассмотрим несколько вопросов:
1. Как включить mod_rewrite на Apache?
2. Немножко теории. Как работает mod_rewrite.
3. Простой пример.
4. Что надо сделать в скрипте?
5. Что дает данный подход и mod_rewrite в целом?
6. Возможные ошибки.
7. Альма-Матер дл изучения mod_rewrite

1. Как включить mod_rewrite на Apache?

Для включения mod_rewrite на веб-сервере Apache необходимо отредактировать файл httpd.conf.
Для этого открываем файл httpd.conf, ищем строчку:

Код
#LoadModule rewrite_module modules/mod_rewrite.so

И убираем комментарий

Код
LoadModule rewrite_module modules/mod_rewrite.so

После чего перезапускаем веб-сервер.

2. Немножко теории. Как работает mod_rewrite.

Как правило, только что столкнувшиеся с mod_rewrite, программисты не понимают до конца как работает данный механизм. Из-за этого долгое время ломают голову над «детскими ошибами.

Итак. Как мы знаем есть, так называемый GET запрос, т.е. http://example.com/2005/12/31/theme.html , который «приходит» на веб-сервер (в нашем примере - Apache). Что делает сервер. Первым делом он смотрит настройки данного хоста. После чего уже принимает решение, что делать дальше. Либо отправить пользователю обратно содержимое заглавной страницы (index.html, к примеру) или отправить на интерпретацию код заглавного скрипта index.php или вернуть ошибку 404 и т.д. и т.п.. Предположим, что у нас дальше пойдет работа с index.phtml. Что будет дальше вы уже наверняка знаете. Мы же остановимся на том моменте, когда сервер смотрит настройки хоста. Их может быть большое множество. Но в обязательном порядке сервер пытается найти в корне файл.htaccess. (файл конфигурации Apache «на лету»). Вот именно в этом файле находятся правила преобразования mod_rewrite (они могут находиться и в httpd.conf). Т.е. я все веду к тому, что преобразование URL’ов ведется ДО работы скриптов.

Алгоритм следующий:
1. Сервер получает GET запрос: http://example.com/2005/12/31/theme.html
2. Находит в.htaccess правила преобразования mod_rewrite.
3. Преобразовывает.
4. Перенаправляет на index.phtml согласно правилам преобразования.
5. Скрипт начинает работать.

3. Простой пример.

Многие из вас видели такую вещь: http://example.com/2005/12/31/theme.html . Такие адреса часто используют новостные сайты. Естественно у них нет всех этих папок и html файлов. Все данные обрабатывает скрипт. Ниже мы рассмотрим один из вариантов такого преобразования. Скажу сразу. Вариантов уйма я лишь беру один частный случай, которым сам пользуюсь и считаю его наиболее универсальным.

Код
RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.phtml

Рассмотрим все по порядку.
Два подряд RewriteCond это условия, между которыми стоит И.
Т.е. Если запрашиваемый адрес не является реально существующим файлом или каталогом перекидываем на index.phtml. Т.е. таким образом мы реализовали то, что у нас запросы http://example.com/2005/12/31/theme.html будут обрабатываться скриптом index.phtml. Теперь весь вопрос, как нам узнать в скрипте что пользователь запрашивает /2005/12/31/theme.html.

Тут лирическое отклонение. Несколько слов о RewrtiterRule. Директива рассматривает параметра. Первый (в нашем случае: ^(.*)$) – строка регулярного выражения, которая проверяет, удовлетворяет ли запрашиваемый адрес (в нашем случае: /2005/12/31/theme.html) паттерну (в нашем случае да, т.к. паттерн гласит: «любой символ 0 и более раз» от начала и до конца строки - ^(.*)$). В случае удовлетворения паттерну, mod_rewrite перенаправляет запрос на файл, указанный во втором параметре (в нашем случае: index.phtml).

Теперь весь вопрос в том, как скрипт узнает о «/2005/12/31/theme.html». Есть два варианта.
Первый:

Код
RewriteRule ^(.*)$ index.phtml?$1 [L]

Где «/2005/12/31/theme.html» будет передано скрипту index.phtml в переменную QUERY_STRING, т.к. $1 – первые круглые скобки в паттерне, что будет равносильно: http://example.com/?/2005/12/31/theme.html . Но, вы где-ть такое видели? Нет. Поэтому, мы используем в качестве ключа QSA.

Есть переменная сервера (к которым скрипты имеют доступ) REQUEST_URI в котором всегда содержится GET запрос («/2005/12/31/theme.html»). Итак, если мы перенаправляем на index.phtml, то REQUEST_URI должен получить значение index.phtml, НО ключ QSA заменяет его НА «/2005/12/31/theme.html». Т.е. мы физически перенаправляем на index.phtml, а логически показываем скрипту, что пользователь обращался к «/2005/12/31/theme.html».

4. Делаем скрипт

Теперь мы уже работаем с index.phtml, скриптом, на который мы произвели перенаправление. Говорю сразу, код на PHP, т.к. другими языками под веб владею плохо.

Вот так все просто. Теперь вы можете оперировать с данным массивом. Дабы было еще понятнее. Приведу аналогию. Предположим такой адрес: http://example.com/index.phtml?year=2005&m...y=31&news=theme . Как мы знаем, что в скрипте данные параметры будут доступны через массив $_GET.
так вот, $_GET[‘year’] то же, что и $arr, $_GET[‘month’] то же, что и $arr, $_GET[‘day’] то же, что и $arr, $_GET[‘theme’] то же, что и $arr (только надо будет еще отрезать «.html»).

5. Что дает данный подход и mod_rewrite в целом?

Во-первых для поисковых систем намного приятнее URL вида: http://example.com/?/2005/12/31/theme.html , нежели http://example.com/index.phtml?year=2005&m...y=31&news=theme , да и для пользователей, согласитесь тоже.

Второй момент. При mod_rewrite практически на «нет» сводится возможность XSS нападения, т.к. include-баг практически перекрывается. На данном примере это не так видно, но поверьте на слово, это так. НО в любом случае все зависит от вашей головы!!!

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

6. Возможные ошибки

Как правило могут возникнуть следующие ошибки:

404 – документ не найден. Причина: правила RewriteRule не срабатывают.
403 – Forbidden – доступ запрещен. Правила реврайта содержат логическую ошибку, которая возникает из-за попытки редиректа на файл, куда нет доступа (/index.php – выдаст именно это, т.к. / в UNIX системах означает путь от корневого каталога СЕРВЕРА, куда само собой у вас доступа не будет).
500 – Internal Server Error. Причина в синтаксической ошибке в файле.htaccess.

7. Альма-Матер дл изучения mod_rewrite

Лично мне эта статья очень помогла. Вот ее аннотация, а ниже я прикрепляю ZIP файл. В нем - эта статья в RTF формате,

Цитата
«Главное преимущество, даваемое Вам mod_rewrite - это возможности конфигурирования и гибкость присущие Sendmail. Обратная сторона mod_rewrite - это возможности конфигурирования и гибкость присущие Sendmail».

Brian Behlendorf

Apache Group
«Несмотря на тонны примеров и документацию, mod_rewrite это Вуду. Чертовски клёвый Вуду, но все-таки Вуду.»

Brian Moore
[email protected]

Добро пожаловать в мир mod_rewrite, швейцарский нож URL преобразований!
Этот модуль использует механизм, основанный на правилах (синтаксический анализатор, основанный на регулярных выражениях) для преобразований URL на лету. Он поддерживает неограниченное количество правил и неограниченное количество связанных с правилом условий для реализации действительно гибкого и мощного механизма для URL преобразований. URL преобразования могут зависеть от разных критериев, например переменных сервера, переменных окружения, HTTP заголовков, времени и даже запросы к внешним базам данных в разных форматах, могут быть использованы для достижения действительно точного соответствия вашим ожиданиям, преобразованных URL.

Этот модуль оперирует с полными URL (включая path-info) и в контексте сервера (httpd.conf) и в контексте каталога (.htaccess) и даже может генерировать части строки запроса в качестве результата. Преобразованный результат может приводить к внутренней обработке, внешнему перенаправлению запроса или даже к прохождению через внутренний прокси модуль.

Однако вся эта функциональность и гибкость имеет свой недостаток: сложность. Поэтому не ожидайте что вы поймете весь этот модуль за один день.
Этот модуль был придуман и написан в апреле 1996 и эксклюзивно подарен The Apache Group в июле 1997

Ralf S. Engelschall
[email protected]
www.engelschall.com

Н а этом уроке, мы научиться управлять перезаписью URL с помощью Apache 2 и модуля mod_rewrite . Этот модуль позволяет переписать URL – адреса в более чистой манере, переводя удобочитаемые пути в кодовые дружественных строки запроса или перенаправляют URL – адреса на основе дополнительных условий.

Это руководство разделено на две части. Первая устанавливает пример веб-сайта и показывает простой пример перезаписи. Вторая часть содержит еще два углубленных примера, часто используемых правил перезаписи.

Предпосылки

Следуя этому руководству, вам потребуется:

  • Один сервер Debian 8 установленный с первоначальной настройкой сервера.
  • Apache 2, установленный на сервере, следуя статьи .

Шаг 1 – Включение mod_rewrite

Во- первых, нам нужно активировать mod_rewrite . Он доступен, но не включен с чистой установкой Apache 2.

Sudo a2enmod rewrite

Он активирует модуль или предупреждает вас о том, что модуль уже включен. Чтобы изменения вступили в силу, перезапустите Apache.

mod_rewrite теперь полностью включен. На следующем шаге мы создадим файл.htaccess , который мы будем использовать, чтобы определить правила перезаписи для редиректа.

Шаг 2 – Настройка.htaccess

Файл.htaccess позволяет изменять наши правила перезаписи без доступа к файлам конфигурации сервера. По этой причине, .htaccess имеет решающее значение для безопасности вашего веб – приложения. Период, который предшествует имени файла гарантирует, что файл скрыт.

Примечание

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

Тем не менее, в этом простом примере, увеличение производительности будет незначительным. Кроме того, устанавливая правила.htaccess удобно, особенно с нескольких веб – сайтами на одном сервере. Она не требует перезагрузки сервера, чтобы изменения вступили в силу, и это не требует привилегий суперпользователя для редактирования этих правил, что упрощает техническое обслуживание и внесение изменений и возможные с непривилегированных аккаунтов. Некоторые популярные программы с открытым исходным кодом, такие как и Joomla, часто полагается на файл.htaccess в программном обеспечении, чтобы изменять и создавать дополнительные правила по требованию.

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

По умолчанию Apache запрещает использование файла.htaccess для применения правил перезаписи, поэтому сначала вам нужно разрешить изменения в файл. Открыть файл конфигурации по умолчанию в Apache, используя nano или ваш любимый текстовый редактор.

Sudo nano /etc/apache2/sites-available/000-default.conf

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

/etc/apache2/sites-available/000-default.conf

Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted . . .

Сохраните и закройте файл. Чтобы изменения вступили в силу, перезапустите Apache.

Sudo systemctl restart apache2

Теперь создайте файл.htaccess в корневой веб директории.

Добавьте эту строку в верхней части нового файла, чтобы активировать перезапись.

/var/www/html/.htaccess

RewriteEngine on

Сохраните файл и выйдите.

Теперь у вас есть оперативный файл.htaccess , который можно использовать для управления правилами маршрутизации вашего веб – приложения. На следующем этапе мы создадим образцы файлов сайта, которые мы будем использовать, чтобы продемонстрировать правила перезаписи.

Шаг 3 – Настройка перезаписи URL

Здесь мы установим базовую перезапись URL, которая преобразует URL – адреса в реальные пути к коду. В частности, мы будем разрешать пользователям доступ. http://your_server_ip /about

Начнем с создания файла с именем about.html в корневой директории веб.

Sudo nano /var/www/html/about.html

Скопируйте следующий HTML-код в файл, а затем сохраните и закройте его.

/var/www/html/about.html

О нас

О нас

Вы можете получить доступ к странице http://your_server_ip/about.html, но обратите внимание, что если вы попытаетесь получить доступ к http://your_server_ip/about, вы увидите ошибку 404 Not Found . Но чтобы пользователи получили доступ к странице с помощью about вместо того, чтобы, переписать правила позволит эта самая функциональность.

RewriteRules соблюдает следующий формат:

Общая структура RewriteRule

RewriteRule pattern substitution

  • RewriteRule определяет директиву.
  • pattern является регулярное выражение, которое соответствует желаемой строки из URL, типы просмотра в браузере.
  • substitution это путь к реальному URL, то есть путь файловых серверов Apache.
  • flags необязательные параметры, которые можно изменять, как работает правило.

Откройте файл.htaccess .

Sudo nano /var/www/html/.htaccess

После первой строки, добавьте RewriteRule отмеченный красным цветом, и сохраните файл.

/var/www/html/.htaccess

RewriteEngine on RewriteRule ^about$ about.html

В этом случае, ^about$ это шаблон, about.html это замена, и является флагом. Наш пример использует несколько символов со специальным значением:

  • ^ указывает на начало URL, после your_server_ip / .
  • $ указывает на конец URL.
  • about соответствует строке “about”.
  • about.html является фактическим файл, который обращается к пользователю.
  • является флагом, который делает случай правила нечувствительным.

Теперь, вы должны иметь возможность доступа к http://your_server_ip/about в вашем браузере. На самом деле, с правилом показанным выше, следующие URL – адреса будут указывать about.html:

  • http://your_server_ip /about , из-за определения правила.
  • http://your_server_ip /About , Так как правило не чувствительно к регистру.
  • http://your_server_ip /about.html , так как оригинальное собственное имя файла всегда будет работать.

Ниже не будет:

  • http://your_server_ip /about/ , потому что правило четко указано, что не может быть ничего после about помощью $ символа.
  • http://your_server_ip /contact , потому что она не будет соответствовать строке about в правиле.

Теперь у вас есть оперативный файл.htaccess с простым правилом, вы можете изменить и расширить для ваших потребностей. В следующих разделах мы покажем два дополнительных примера наиболее часто используемых директив.

Пример 1 – Упрощение строки запросов с RewriteRule

Веб – приложения часто используют строки запроса , которые добавляются к URL – адресу, используя знак вопроса (?) после адреса. Отдельные параметры разделяются с помощью амперсанда (&). Строки запроса могут быть использованы для передачи дополнительных данных между отдельными страницами приложения.

Например, страницы результатов поиска написанные на PHP, могут использовать URL, как http://example.ru/results.php?item=shirt&author=andreyex . В этом примере два дополнительных параметра передают воображаемый result.php сценария приложения: item со значением shirt и author со значением andreyex . Приложение может использовать информацию строки запроса, чтобы построить правильную страницу для посетителя.

Правила перезаписи Apache часто используются для упрощения таких длинных и неприглядных ссылок как выше в дружественные URL – адреса , которые легче вводить и интерпретировать визуально. В этом примере, мы хотели бы, упростить ссылку выше, чтобы сделать http://example.ru/shirt/andreyex . shirt и значения параметров author и andreyex к прежнему адресу, но без строки запроса и имени сценария.

Вот одно правило для реализации этого:

Простой пример

RewriteRule ^shirt/andreyex$ results.php?item=shirt&author=andreyex

shirt/andreyex явно сопоставляются в запрашиваемом адресе и Apache указал запустить вместо этого results.php?item=shirt&author=andreyex .

флаги обычно используются в правила[ перезаписи. Они говорят Apache, чтобы добавить любые дополнительные строки запроса к обслуживаемому URL. Без этого, дополнительная строка запроса будет отбрасываются. http://example.ru/shirt/andreyex?page=2 results.php?item=shirt&author=andreyex&page=2

Хотя этот метод позволяет достичь желаемого эффекта, как имя элемента и author жестко закодированы в правила. Это означает, что правило не будет работать для любыми другими предметами, например pants , или author, как destroyer .

Для того, чтобы сделать правило более общо, мы можем использовать регулярные выражения, чтобы соответствовать части исходного адреса и использовать те части в схеме замещения. Модифицированное правило будет выглядеть следующим образом:

Простой пример

RewriteRule ^(+)/(andreyex|destroyer|fall|spring) results.php?item=$1&author=$2

Первое регулярное выражение группы в скобках соответствует строке, содержащей буквенно-цифровые символы и цифры, как shirt или pants и сохраняет совпавший фрагмент в качестве переменной $1 . Вторая группа выражений в скобках соответствует точно andreyex , destroyer , fall или spring , и так же сохраняет совпавший фрагмент как $2 .

Согласованные фрагменты затем в результирующий URL в переменные item и author вместо жёстко shirt и andreyex , которые мы использовали раньше.

Выше будет преобразовывать, например, http://example.ru/pants/andreyex в http://example.ru/results.php?item=pants&author=andreyex . Этот пример также на будущее, позволяя нескольким элементам и author правильно переписать с использованием единого правила.

Пример 2 – Добавление условия с помощью логики, используя RewriteConds

Правила перезаписи не обязательно всегда вычисляются один за другим без каких – либо ограничений. Директива RewriteCond позволяет нам добавлять условия для наших правил перезаписи, чтобы контролировать, когда правила будут обработаны. RewriteConds соблюдает следующий формат:

Общая структура RewriteCond

RewriteCond TestString Condition

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

Если имеет RewriteCond значение истинно, то RewriteRule сразу после будет рассмотрен. Если это не будет, то правило будет отброшено. Многократная RewriteCond может использоваться один за другим, и с поведением по умолчанию, все они должны оценить, верно и в следующем правиле для рассмотрения.

В качестве примера, давайте предположим, что вы хотели бы перенаправить все запросы на несуществующие файлы и каталоги на вашем сайте обратно на главную страницу вместо того чтобы показывать стандартную страницу ошибку 404 Not Found . Это может быть достигнуто с следующими условиями правил:

Перенаправить все запросы на несуществующие файлы и каталоги на главную страницу

RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /

С учетом указанных выше:

  • %{REQUEST_FILENAME} это строка для проверки. В этом случае, запрашиваемое имя файла, которое является переменной системой, доступной для каждого запроса.
  • -f встроенное в условие, которое проверяет, существует ли запрашиваемое имя на диске, и является ли файлом. ! - Является оператором отрицания. В сочетании!-f оценивается как истина, только если указанное имя не существует или не является файлом.
  • Аналогичным образом, !-d оценивается как истина, только если указанное имя не существует или не является каталогом.

RewriteRule На последней строке вступит в силу только для запросов на несуществующие файлы и каталоги. RewriteRule Сама по себе очень проста и перенаправляет каждый запрос на / корень сайта.

Вывод

mod_rewrite полезный модуль Apache, который может быть эффективно использован для обеспечения удобочитаемых URL. На этом уроке вы узнали, как использовать директиву RewriteRule для перенаправления URL – адресов, в том числе с строки запроса. Вы также узнали перенаправление URL – адреса с помощью директивы RewriteCond .

Модуль Mod rewrite используется для преобразования URL на основе правил. В статье рассказывается, как включить поддержку модуля Mod rewrite в веб-сервере Apache в операционной системе Ubuntu.

Подключаем модуль Mod rewrite

Перейдите в каталог /etc/apache2/mods-available и убедитесь, что там есть файл rewrite.load отвечающий за загрузку модуля Mod rewrite. Для этого выполните в консоли следующие команды:

Cd /etc/apache2/mods-available ls

В списке файлов должен присутствовать файл с именем rewrite.load .

Теперь перейдем в каталог /etc/apache2/mods-enabled и создадим символьную ссылку на файл rewrite.load . Для этого выполните команды:

Cd /etc/apache2/mods-enabled sudo ln -s ../mods-available/rewrite.load rewrite.load

Изменяем настройки виртуального хоста

Далее нужно изменить настройки виртуального хоста, который должен использовать модуль Mod rewrite. Для этого нужно открыть файл настроек конкретного хоста. Для примера возьмем стандартный файл /etc/apache2/sites-available/default , который содержит настройки хоста с именем localhost. Выполните следующую команду, чтобы открыть файл в редакторе GEdit:

Sudo gedit /etc/apache2/sites-available/crocodilus

Найдите в файле секцию и измените в ней строку AllowOverride None на AllowOverride All . Должно получиться примерно так:

Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all

Перезапускаем Apache

Теперь осталось перезапустить веб-сервер Apache командой.

В данном уроке объясняется, что такое mod_rewrite и как его использовать. Описываются три практичных примера: перенаправление 301, создание дружественных URL и блокирование использования ссылок на изображения.

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

Использование mod_rewrite может представлять определенные трудности для новичков по причине сложного синтаксиса и механизма обработки. Однако, стоит разобраться в нескольких базовых концепциях и можно будет эффективно использовать mod_rewrite для собственного сервера.

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

Что такое mod_rewrite?

mod_rewrite - это модуль сервера Apache для манипуляции (изменения) URL. Часто это означает получение запроса URL от посетителя и посылка ему содержания с другого URL. Например, посетитель вводит следующий URL в адресной строке браузера:

Http://www.example.com/page.html

Обычно Apache отправляет обратно пользователю содержание файла page.html . Однако с помощью mod_rewrite можно отправить содержание с другого URL, например такого:

Http://www.example.com/another_page.html

Важно понимать, что изменение адреса происходит внутри сервера Apache. Адресная строка браузера по прежнему будет показывать http://www.example.com/page.html , но сервер Apache отправит содержание страницы http://www.example.com/another_page.html . В этом заключается отличие от перенаправления HTTP, которое указывает браузеру посетить другой URL.

Хотя с помощью модуля mod_rewrite можно выполнять и перенаправление HTTP и еще много других функций, таких как возвращение кодов ошибки HTTP.

Что можно делать с помощью mod_rewrite

Модуль mod_rewrite позволяет создавать правила манипулирования адресами URL. Например, вы можете вставить значение полученное из запрашиваемого URL в новый URL, организуя динамическое перенаправление URL. Или можно проверить переменные сервера, например, HTTP_USER_AGENT (тип браузера), и изменять URL только если используется браузер, например, Safari, запущенный на iPhone.

Вот несколько обычных функций, которые выполняет mod_rewrite:

  • Создание "дружественных" адресов URL, которые маскируют "корявые" адреса URL. Например, вы можете маскировать с помощью отлично выглядящего адреса URL www.example.com/articles/my-article/ реальный адрес URL www.example.com/display_article.php?articleId=my-article . И каждый сможет использовать "дружественный" адрес URL вместо реального.
  • Блокировать использование ссылок на изображения на вашем сайте. Чтобы остановить использование другими ресурсами изображений, размещенных на вашем сайте, можно использовать mod_rewrite для отправки ошибки "Forbidden", если ссылающийся URL не принадлежит вашему сайту.
  • Перенаправление канонических адресов URL. Многие страницы доступны через несколько адресов URL — например, www.example.com/mypage.html и example.com/mypage.html . Вы можете использовать mod_rewrite постоянного перенаправления браузера на "правильный" URL, например www.example.com/mypage.html . Помимо прочего такое использование mod_rewrite гарантирует отображение правильного URL в результатат поиска.
  • Исключение ошибки 404 в момент реорганизации вашего сайта. Например, вы переделываете сайт и переместили страницу www.example.com/myarticle.html по новому адресу www.example.com/articles/myarticle.html . С помощью mod_rewrite вы можете перенаправить www.example.com/myarticle.html на www.example.com/articles/myarticle.html , так что посетитель не получит ошибку 404 "не найдена" при посещении старого адреса URL. Благодаря гибкости mod_rewrite, можно легко создать правило, которое будет перенаправлять запросы на старые адреса URL на новые адреса.

Как использовать mod_rewrite

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

Две самых важных директивы mod_rewrite:

  • RewriteEngine : Включает/выключает механизм mod_rewrite для текущего запроса.
  • RewriteRule : Описывает правило изменения адреса URL.

Вот простой пример. Создайте файл.htaccess со следующим содержанием и разместите его на вашем сайте:

RewriteEngine on RewriteRule ^dummy\.html$ http://www.google.com/

В данном файле задаются следующие установки:

  • RewriteRule ^dummy\.html$ http://www.google.com/ - перенаправялем запросы к странице dummy.html на сайт Google, используя перенаправление 301.

Если теперь открыть веб-браузер и посетить страницу dummy.html на вашем сайте (например, введя в адресной строке http://www.example.com/dummy.html), то, если все было сделано без ошибок, произойдет перенаправление на сайт http://www.google.com .

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

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

Вы можете использовать директиву RewriteRule для создания правил перенаправления. Обобщенный синтаксис директивы имеет вид:

RewriteRule Pattern Substitution

  • Pattern - регулярное выражение шаблона. Если URL соответствует шаблону, то правило выполняется. Иначе правило пропускается.
  • Substitution - новый URL, который будет использоваться вместо соответствующего шаблону адреса.
  • - один или несколько флагов, которые определяют поведение правила.

Вы можете добавить в файл.htaccess столько правил RewriteRule , сколько нужно. Модуль mod_rewrite проходит все правила каждый раз при запросе, обрабатывая соответствующие адресу URL.

Если правило изменяет запрашиваемый URL на новый адрес, то новый URL используется дальше при проходе по файлу.htaccess , и может соответствовать другому правилу RewriteRule , размещающемуся далее в файле. (Если нужно изменить такое поведение, то надо использовать флаг L ("последнее правило").)

Несколько примеров использования mod_rewrite

Самый простой способ объяснить mod_rewrite - показать его использование при решении практических задач.

Пример 1: исключение ошибки 404

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

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

Следующий файл.htaccess перенаправит запросы на новый адрес URL:

RewriteEngine on RewriteRule ^my-old-url\.html$ /my-new-url.html

Правило RewriteRule работает так:

  • ^my-old-url\.html$ - регулярное выражение, которому соответствует адрес URL для изменения. Шаблон означает: "соответствует началу адреса URL (^), за которым следует текст "my-old-url.html" , за которым следует символ окончания URL ($)." В регулярном выражении символ точки (.) означает соответствие любому символу, поэтому нужно использовать обратный слэш, чтобы указать, что нам нужна именно точка (\.).
  • /my-new-url.html - вторая часть правила RewriteRule , которая описывает на что нужно менять. В данном случае это просто /my-new-url.html.
  • третья часть правила, которая содержит один или несколько флагов, помещенных в квадратные скобки. Флаги позволяют добавлять определенные опции или действия к правилу. В данном примере используется 2 флага: R=301 означает "использовать перенаправление 301 на новый адрес URL"; а L означает "последнее правило", или другими словами "остановить процесс обработки URL, если он соответствует правилу ".

Пример 2: создание дружественных адресов URL

Допустим, вы написали PHP скрипт display_article.php для вывода статей на вашем сайте. Вы можете ссылаться на статью с помощью следующего адреса URL:

Http://www.example.com/display_article.php?articleId=my-article

Данный адрес выглядит уродливо и запрос внутри него (?articleId=my-article) может смущать некоторые поисковые механизмы. Гораздо лучше использовать адрес URL такого вида:

Http://www.example.com/articles/my-article/

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

RewriteEngine on RewriteRule ^articles/([^/]+)/?$ display_article.php?articleId=$1 [L]

Описание правила RewriteRule:

  • ^articles/([^/]+)/?$ - регулярное выражение, соответствующее любому URL в формате articles/(article ID)/ . Оно гласит:"соответствует началу URL (^) , за которым следует текст articles/ , за которым следует один или более символов, не являющиеся слэшем ([^/]+) , за которыми может следовать слэш (/?) , за которым следует символ окончания URL ($) ". Обратите внимание на круглые скобки вокруг части шаблона [^/]+ . Таким образом текст, соответствующей данной части, например, "my-article" , сохраняется для дальнейшего использования.
  • display_article.php?articleId=$1 - данная часть правила указывает серверу Apache использовать скрипт display_article.php , которому передается текст, соответствующий подшаблону [^/]+ из регулярного выражения первой части (например, "my-article"), в качестве параметра articleId . $1 называется обратной связью и хранит текст соответствующий подшаблону. Если регулярное выражение содержит еще один подшаблон в круглых скобках, то соответствующий ему текст будет храниться в переменной $2, и так далее.
  • [L] - как и в предыдущем примере мы используем флаг для остановки дальнейшей обработки URL, чтобы не произошло изменение адреса другими правилами RewriteRule.

Выше приведенное правило RewriteRule берет запрашиваемый URL в формате http://www.example.com/articles/my-article/ и преобразует его в URL вида http://www.example.com/display_article.php?articleId=my-article .

Пример 3: предотвращаем использование ссылок на изображения на вашем сайте

Еще одной типовой задачей, которую решает использование модуля mod_rewrite, является предотвращение использования ссылок на изображения на вашем сайте другими веб проектами. Допустим, на вашем сайте есть страница http://www.example.com/mypage.html , которая содержит следующий тег img:

Другой сайт может ссылаться на своих страницах прямо на вашу фотографию следующим образом:

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

Вы можете использовать следующие директивы mod_rewrite для того, чтобы прекратить использование ссылок на изображения всеми другими сайтами, кроме вашего собственного. Разместите ниже приведенный код в файле.htaccess в корневом каталоге вашего сайта или в папке с изображениями, которые надо защитить. Измените example.com на имя вашего домена.

RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ RewriteRule .+\.(gif|jpg|png)$ - [F]

Как только вы закончите выполнять все операции копирования любой браузер, запрашивающий изображения с вашего сайта использующий при запросе URL, начинающийся с имени домена, отличного от www.example.com или example.com , будет получать ошибку "403 Forbidden". что остановит использование ссылок на ваши изображения на других сайтах.

Вот как работает данный набор правил:

  • RewriteEngine on - включаем механизм mod_rewrite
  • RewriteCond %{HTTP_REFERER} !^$ - RewriteCond является еще одной директивой mod_rewrite. Она позволяет устанавливать условие, которое должно выполняться для обработки URL следующим за ним правилом RewriteRule . В данном случае условием является наличие значения в переменной HTTP_REFERER .
  • RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ - вторая директива RewriteCond требует, чтобы значение переменной HTTP_REFERER не начиналось с http://www.example.com/ или http://example.com/ . Флаг устанавливает чувствительность к регистру символов.
  • RewriteRule .+\.(gif|jpg|png)$ - [F] - если два выше предыдущих условия RewriteCond не выполняются, то правило пропускается. Само же правило возвращает ошибку "403 Forbidden" (используется флаг [F]), если URL содержит имя файла изображения (строка заканчивается на.gif , .jpg или.png), Тире в параметре подстановки означает "не надо заменять URL другим адресом".

То есть весь набор правил в файле.htaccess гласит, если переменная HTTP_REFERER содержит значение, и оно не начинается на http://example.com/ или http://www.example.com/ , и запрашиваемый URL содержит имя файла изображения, то надо отказать запросу с ошибкой "403 Forbidden".

Заключение

В данном уроке мы провели введение в использование модуля сервера Apache mod_rewrite для манипулирования адресами URL. Рассмотренные три практических примера затрагивают лишь небольшую часть всех возможностей модуля. Более подробную информацию о mod-rewrite на русском языке можно найти .