Настройка mod_rewrite на веб-сервере Apache в Ubuntu 14.04

Данное руководство поможет настроить перезапись URL-адресов на Apache2 с помощью модуля mod_rewrite. Этот инструмент позволяет переписывать URL-адреса и создавать чистые ссылки, преобразовывая сложные пути в понятные и читабельные ссылки.

Требования

1: Установка Apache

Apache можно установить с помощью пакетного менеджера apt-get.

Сначала нужно обновить индекс пакетов:

sudo apt-get update

Apache – это популярный модульный веб-сервер (то есть, он позволяет настраивать функции путём включения и отключения модулей). Чтобы установить Apache 2, введите:

sudo apt-get install apache2

Сервер Apache успешно установлен.

Теперь нужно сосредоточить внимание на модулях.

2: Модуль mod_rewrite

Чтобы включить mod_rewrite, введите:

sudo a2enmod rewrite

Команда включит модуль и сообщит вам о том, что модуль работает. Чтобы обновить настройки веб-сервера, перезапустите его:

sudo service apache2 restart

3: Создание файла .htaccess

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

Файл .htaccess определяет индивидуальные директивы Apache для каждого отдельного домена.

Примечание: В Linux с символа точки начинаются имена скрытых файлов.

Сначала нужно включить поддержку файлов .htaccess. Для этого отредактируйте директиву AllowOverride в конфигурационном файле Apache. Откройте файл:

sudo nano /etc/apache2/sites-enabled/000-default.conf

Найдите блок <VirtualHost *:80> и добавьте в него такой блок:

etc/apache2/sites-available/default
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

Теперь конфигурационный файл веб-сервера должен выглядеть так:

/etc/apache2/sites-available/default
<VirtualHost *:80>
<Directory /var/www/html>
. . .
</Directory>
. . .
</VirtualHost>

Чтобы обновить настройки, перезапустите Apache.

sudo service apache2 restart

Создайте файл .htaccess:

sudo nano /var/www/html/.htaccess

Добавьте в начало нового файла такую строку, чтобы активировать RewriteEngine:

RewriteEngine on

Сохраните и закройте файл. Так Apache сможет обрабатывать правила перезаписи.

Другие пользователи должны иметь только право на чтение .htaccess. Измените права доступа к файлу:

sudo chmod 644 /var/www/html/.htaccess

4: Настройка перезаписи

Данный раздел покажет, как настроить базовую перезапись URL-адресов. В качестве примера используется ссылка example.com/about.

Создайте файл about.html:

sudo nano /var/www/html/about.html

Скопируйте следующий код и поместите его в файл:

<html>
<head>
<title>About Us</title>
</head>
<body>
<h1>About Us</h1>
</body>
</html>

Теперь страница доступна в браузере по ссылке ip_адрес_сервера/about.html или example.com/about.html.

Обратите внимание: доступ можно получить только к about.html. Если вы введёте ссылку ip_адрес_сервера /about, вы получите ошибку 404 Not Found. Создайте правило перезаписи, чтобы исправить это.

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

sudo nano /var/www/html/.htaccess

Добавьте в него следующую строку:

RewriteRule ^about$ about.html [NC]

Теперь файл содержит такие настройки:

RewriteEngine on
RewriteRule ^about$ about.html [NC]

Теперь браузер сможет обслуживать страницу example.com/about.

На примере этого правила можно рассмотреть общий синтаксис перезаписи.

  • ^about$ – шаблон, с которым совпадает URL, и который пользователи вводят в браузере. В данном примере используются метасимволы, благодаря которым можно чётко обозначить местонахождение шаблона: символ ^ определяет начало шаблона, а • $ – конец.
  • about.html: исходный путь к странице, по которому обслуживается файл about.html.
  • [NC]: флаг, который отключает чувствительность URL-адреса к регистру.

Согласно этому правилу, доступ к странице можно получить по следующим ссылкам:

example.com/about
example.com/About
example.com/about.html

А такие ссылки не сработают:

example.com/about/
example.com/contact

Общие шаблоны

Итак, теперь вы знаете основы написания правил перезаписи. Рассмотрим два дополнительных примера.

Примечание: Для тестирования можно создать пару дополнительных файлов.

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

Правила RewriteRule имеют такой формат:

RewriteRule pattern substitution [flags]

Где:

  • RewriteRule: директива.
  • pattern: регулярное выражение, которое задаёт шаблон поиска строки.
  • substitution: целевой URL-адрес
  • flags: опциональные параметры, которые изменяют поведение правила.

Приложения часто используют строки запросов. Эти строки находятся в URL-адресе, начиная с вопросительного знака (?) и заканчивая амперсандом (&). Обрабатывая правила перезаписи, Apache игнорирует эти два символа. К примеру, URL страницы результатов поиска, написанной на PHP, может выглядеть следующим образом:

http://example.com/results.php?item=shirt&season=summer

Конечно, пользователям будет гораздо удобнее, если ссылка будет чистой:

http://example.com/shirt/summer

Этого можно добиться двумя способами: с помощью простой замены или группирования параметров.

1: Простая замена

Создайте правило, выполняющее простую замену, чтобы ссылка стала чистой:

RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer

Это правило вместо results.php?item=shirt&season=summer будет использовать shirt/summer.

2: Сопоставление и группирование

В некоторых ситуациях нужно оптимизировать строку запросов (к примеру, чтобы она включала все сезоны). Для этого нужно:

  • Задать набор параметров, разделив их с помощью символа вертикальной черты | (логический оператор OR).
  • Сгруппировать все заданные параметры с помощью круглых скобок (), а затем сослаться на группу с помощью переменной $1 (где 1 – номер группы параметров).

В результате получится такое правило:

RewriteRule ^shirt/(summer|winter|fall|spring) results.php?item=shirt&season=$1

Это правило добавляет в URL новый сегмент.

3: Совпадение наборов символов

Чтобы пользователь мог открыть чистый URL любого раздела сайта (не только / shirt), нужно:

  • Написать регулярное выражение, совпадающее со всеми алфавитно-цифровыми символами. В квадратных скобках указывается поисковой шаблон (в данном случае он включает все символы), а символ + указывет что каждый символ в шаблоне может повторяться неограниченное количество раз.
  • Сгруппировать этот набор символов и присвоить ему $2.

RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2

Это правило перепишет ссылку:

http://example.com/results.php?item=pants&season=summer

в:

http://example.com/pants/summer

4: Дополнительная строка запроса

Это позволит вам устранить ряд потенциальных проблем. Попробуйте преобразовать:

http://example.com/pants/summer?page=2

в:

http://example.com/results.php?item=pants&season=summer&page=2

При текущих настройках вы не сможете перейти на page=2. Это можно исправить с помощью флага QSA, который позволяет комбинировать строки запросов. Отредактируйте правило следующим образом:

RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]

Пример 2: Условия RewriteCond

Теперь рассмотрим подробнее директиву RewriteCond. RewriteCond имеет такой формат:

RewriteCond TestString Condition [Flags]

  • RewriteCond: директива.
  • TestString: строка для сравнения.
  • Condition: шаблон, с которым нужно сравнить строку.
  • Flags: дополнительные параметры.

Если условие перезаписи RewriteCond истинно, Apache обработает следующее за ним правило RewriteRule.

 1: Страница по умолчанию

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home

Теперь все ссылки на несуществующие страницы будут перенаправлены на /admin/home.

Рассмотрим вышеприведённое правило по частям:

  • %{REQUEST_FILENAME} проверяет запрашиваемую строку.
  • !-f: оператор ! (not) указывает, что если запрашиваемого файла не существует, веб-сервер должен выполнить следующее правило переадресации.
  • RewriteRule перенаправляет запрос на /admin/home.

Также можно задать ErrorDocument, на который будут отправляться все запросы на несуществующие страницы. Создайте правило ErrorDocument и перенаправьте все ошибки 404 на страницу error.html:

ErrorDocument 404 /error.html

2: Ограничение доступа по IP

RewriteCond позволяет ограничивать доступ к сайту по IP-адресу.

К примеру, это правило заблокирует весь трафик, кроме 12.34.56.789:

RewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

Читайте также: Настройка Mod_Rewrite

Если сайт будет запрашиваться другими IP-адресами, трафик будет заблокирован.

Вкратце рассмотрим это правило:

  • %{REMOTE_ADDR} – строка адреса.
  • !^(12\.34\.56\.789)$ – IP-адрес. Обратный слеш позволяет обойти метасимвол «.».
  • Флаг F запрещает доступ, а L означает, что это правило должно выполняться последним.

Чтобы заблокировать доступ к сайту для определенного IP, используйте такое правило:

RewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

Существует множество способов управления доступом к сайту, и файл .htaccess – один из самых простых.

Заключение

Модуль mod_rewrite – один из основных компонентов Apache.

В данном руководстве вы научились создавать файл .htaccess и работать с директивами RewriteRule и RewriteCond.

Читайте также:

Регулярное выражение можно быстро проверить с помощью этого онлайн-приложения. Оно сразу же обнаруживает ошибки и даёт рекомендации по их исправлению.

Tags: , ,

Добавить комментарий