Как настроить mod_rewrite для Apache в Ubuntu 14.04
Введение
В этом руководстве мы активируем и узнаем, как управлять перезаписью URL-адресов с помощью модуля Apache2 mod_rewrite
. Этот инструмент позволяет нам более аккуратно переписывать URL-адреса, переводя удобочитаемые пути в строки запроса, удобные для кода.
Это руководство разделено на две части: в первой настраивается пример веб-приложения, а во второй объясняются часто используемые правила перезаписи.
Предпосылки
Чтобы следовать этому руководству, вам понадобятся:
- Одна свежая капля Ubuntu 14.04
- Пользователь sudo без полномочий root, которого можно настроить, выполнив шаги 2 и 3 этого руководства.
Шаг 1 — Установка Apache
На этом шаге мы будем использовать встроенный установщик пакетов под названием apt-get
. Это значительно упрощает управление и облегчает чистую установку.
Во-первых, обновите системный индекс пакетов. Это гарантирует, что старые или устаревшие пакеты не будут мешать установке.
- sudo apt-get update
Apache2 — это вышеупомянутый HTTP-сервер, наиболее часто используемый в мире. Чтобы установить его, выполните следующее:
- sudo apt-get install apache2
Информацию о различиях между Nginx и Apache2, двумя наиболее популярными веб-серверами с открытым исходным кодом, см. в этой статье.
Шаг 2 — Включение mod_rewrite
Теперь нам нужно активировать mod_rewrite
.
- sudo a2enmod rewrite
Это активирует модуль или предупредит вас о том, что модуль уже действует. Чтобы эти изменения вступили в силу, перезапустите Apache.
- sudo service apache2 restart
Шаг 3 — Настройка .htaccess
В этом разделе мы настроим файл .htaccess
для более простого управления правилами перезаписи.
Файл .htaccess
позволяет нам изменять наши правила перезаписи без доступа к файлам конфигурации сервера. По этой причине .htaccess
имеет решающее значение для безопасности вашего веб-приложения. Точка перед именем файла гарантирует, что файл скрыт.
Прежде чем мы сможем начать, нам нужно будет настроить и защитить еще несколько настроек.
Во-первых, разрешите изменения в файле .htaccess
. Откройте файл конфигурации Apache по умолчанию с помощью nano
или вашего любимого текстового редактора.
- sudo nano /etc/apache2/sites-enabled/000-default.conf
Внутри этого файла вы найдете блок
в строке 1. Внутри этого блока добавьте следующий блок:
/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
.
/var/www/html/.htaccessRewriteEngine on
Сохраните и закройте файл.
Чтобы другие пользователи могли только читать ваш .htaccess
, выполните следующую команду для обновления разрешений.
- sudo chmod 644 /var/www/html/.htaccess
Теперь у вас есть рабочий файл .htaccess
для управления правилами маршрутизации вашего веб-приложения.
Шаг 4 — Настройка файлов
В этом разделе мы настроим базовую перезапись URL-адресов, которая преобразует красивые URL-адреса в фактические пути к коду. В частности, мы разрешим пользователям доступ к example.com/about
.
Мы начнем с создания файла с именем about.html
.
- sudo nano /var/www/html/about.html
Скопируйте следующий код на HTML-страницу.
/var/www/html/about.html<html>
<head>
<title>About Us</title>
</head>
<body>
<h1>About Us</h1>
</body>
</html>
Вы можете получить доступ к своему веб-приложению по адресу your_server_ip/about.html
или example.com/about.html
. Теперь обратите внимание, что доступен только about.html
; если вы попытаетесь получить доступ к your_server_ip/about
, вы получите сообщение об ошибке Not Found. Вместо этого мы хотели бы, чтобы пользователи получали доступ к about
. Наши правила перезаписи разрешат эту самую функциональность.
Откройте файл .htaccess
.
- sudo nano /var/www/html/.htaccess
После первой строки добавьте следующую.
/var/www/html/.htaccessRewriteRule ^about$ about.html [NC]
Теперь ваш файл должен быть идентичен следующему.
/var/www/html/.htaccessRewriteEngine on
RewriteRule ^about$ about.html [NC]
Поздравляем. Теперь вы можете получить доступ к example.com/about
в своем браузере!
Это хороший простой пример, показывающий общий синтаксис, которому следуют все правила перезаписи.
^about$
— это строка, которая сопоставляется с URL-адресом. То есть это то, что зритель набирает в своем браузере. В нашем примере используется несколько метасимволов.
^
указывает начало URL после удаленияexample.com/
.$
указывает конец URL-адреса.about
соответствует строке \about
about.html
— это фактический путь, к которому обращается пользователь; то есть Apache по-прежнему будет обслуживать файл about.html
.
[NC]
– это флаг, игнорирующий заглавные буквы в URL-адресе.
С приведенным выше правилом следующие URL-адреса будут указывать на about.html
:
example.com/about
example.com/О программе
example.com/about.html
Следующее не будет:
example.com/about/
example.com/contact
Общие шаблоны
В этом разделе мы покажем некоторые часто используемые директивы.
Теперь ваше веб-приложение запущено и управляется защищенным файлом .htaccess
. Самый простой пример был приведен выше. В этом разделе мы рассмотрим еще два примера.
Вы можете настроить файлы примеров по путям результатов, если хотите, но это руководство не включает создание файлов HTML и PHP; просто правила перезаписи.
Пример 1. Упрощение строк запроса с помощью RewriteRule
Все RewriteRule
придерживаются следующего формата:
RewriteRule pattern substitution [flags]
- RewriteRule: указывает директиву
RewriteRule
- шаблон: регулярное выражение, соответствующее нужной строке
- замена: путь к фактическому URL
- флаги: необязательные параметры, которые могут изменить правило.
Веб-приложения часто используют строки запроса, которые добавляются к URL-адресу с помощью вопросительного знака ?
и разделяются с помощью амперсанда &
. Они игнорируются при сопоставлении правил перезаписи. Однако иногда могут потребоваться строки запроса для передачи данных между страницами. Например, страница результатов поиска, написанная на PHP, может использовать что-то вроде следующего:
http://example.com/results.php?item=shirt&season=summer
В этом примере мы хотели бы упростить это, чтобы стать:
http://example.com/shirt/summer
Пример 1A: простая замена
Используя правило перезаписи, мы могли бы использовать следующее:
/var/www/html/.htaccessRewriteRule ^shirt/summer$ results.php?item=shirt&season=summer
Вышеизложенное говорит само за себя, так как фактически сопоставляет shirt/summer
с results.php?item=shirt&season=summer
. Это позволяет достичь желаемого эффекта.
Пример 1B: варианты сопоставления
Однако мы хотели бы обобщить это, чтобы включить все сезоны. Итак, мы будем делать следующее:
- Укажите ряд параметров, используя логическое значение
|
, что означает \ИЛИ - Сгруппируйте соответствие с помощью
()
, затем укажите ссылку на группу с помощью$1
, при этом1
для первой совпавшей группы
Правило перезаписи теперь выглядит так:
/var/www/html/.htaccessRewriteRule ^shirt/(summer|winter|fall|spring) results.php?item=shirt&season=$1
Правило, показанное выше, соответствует URL-адресу shirt/
, за которым следует указанный сезон. Этот сезон группируется с помощью ()
, а затем ссылается на $1
в последующем пути. Это означает, например, что:
http://example.com/shirt/winter
становится:
http://example.com/results.php?item=shirt&season=winter
Этим также достигается желаемый эффект.
Пример 1C: Сопоставление наборов символов
Однако мы также хотели бы указать любой тип элемента, а не только URL-адреса в /shirt
. Итак, мы будем делать следующее:
- Напишите регулярное выражение, соответствующее всем буквенно-цифровым символам. Выражение в скобках
[]
соответствует любому символу внутри него, а+
соответствует любому количеству символов, указанному в скобках - Сгруппируйте соответствие и укажите ссылку на него с помощью
$2
в качестве второй переменной в файле.
/var/www/html/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2
Вышеприведенное будет конвертировать, например:
http://example.com/pants/summer
к:
http://example.com/results.php?item=pants&season=summer
Пример 1D: передача строк запроса
В этом разделе не вводятся какие-либо новые концепции, но рассматривается проблема, которая может возникнуть. Используя приведенный выше пример, скажем, мы хотели бы перенаправить http://example.com/pants/summer
, но передаем дополнительную строку запроса ?page=2
. Мы хотели бы следующее:
http://example.com/pants/summer?page=2
сопоставить с:
http://example.com/results.php?item=pants&season=summer&page=2
Если бы вы попытались получить доступ к указанному выше URL-адресу с нашими текущими настройками, вы бы обнаружили, что строка запроса page=2
потеряна. Это легко исправить с помощью дополнительного флага QSA
. Измените правило перезаписи, чтобы оно соответствовало следующему, и желаемое поведение будет достигнуто.
/var/www/html/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
Пример 2: Добавление условий с помощью логики
RewriteCond
позволяет нам добавлять условия к нашим правилам перезаписи. Все RewriteCond
соответствуют следующему формату:
RewriteCond TestString Condition [Flags]
- RewriteCond: указывает директиву
RewriteCond
- TestString: строка для проверки.
- Условие: шаблон для соответствия
- Флаги: необязательные параметры, которые могут изменить условие.
Если RewriteCond
оценивается как true, будет рассмотрен следующий за ним RewriteRule
.
Пример 2A: страница по умолчанию
В воображаемой административной панели мы можем захотеть направить все неверные URL-адреса обратно на домашнюю страницу вместо того, чтобы приветствовать пользователей с ошибкой 404. Используя условие, мы можем проверить, существует ли запрошенный файл.
/var/www/html/.htaccessRewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home
Это перенаправит что-то вроде /admin/blargh
на /admin/home
.
С вышеизложенным:
%{REQUEST_FILENAME}
– строка для проверки!-f
использует оператор!
not в имени файлаRewriteRule
перенаправляет все запросы обратно в/admin/home
Обратите внимание, что более синтаксически и технически правильным подходом было бы определение 404 ErrorDocument
.
/var/www/html/.htaccessErrorDocument 404 /error.html
Пример 2B: Ограничение доступа по IP
Хотя это также может быть достигнуто с помощью других методов, RewriteCond
можно использовать для ограничения доступа к одному IP-адресу или набору IP-адресов.
В этом примере блокируется трафик отовсюду, кроме 12.34.56.789.
/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]
Этот пример — просто отрицание примера 3 из старой статьи mod_rewrite. Весь оператор гласит: «Если адрес отличен от 12.34.56.789, доступ запрещен».
Суммируя:
%{REMOTE_ADDR}
— адресная строка!^(12\.34\.56\.789)$
экранирует все точки.
с помощью обратной косой черты\
и отменяет IP-адрес с использованием!
- Флаг
F
запрещает доступ, а флагL
указывает, что это правило выполняется последним, если оно выполняется
Если вы предпочитаете блокировать 12.34.56.789, используйте вместо этого:
/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]
Вы можете найти больше правил перезаписи и способы предотвращения горячих ссылок во второй части исходной статьи.
Заключение
mod_rewrite
можно эффективно использовать для обеспечения удобочитаемости URL-адресов. Однако сам файл .htaccess
имеет гораздо больше применений, чем просто этот модуль, и следует отметить, что многие другие модули Apache могут быть установлены для расширения его функциональности.
Есть и другие ресурсы, подробно описывающие возможности mod_rewrite
:
- Введение в Apache mod_rewrite
- Документация Apache для mod_rewrite
- памятка mod_rewrite
mod_rewrite
— критически важный модуль для безопасности веб-приложений, но иногда он может привести к возникновению циклов перенаправления или вездесущим двусмысленным ошибкам 500 запрещенных
. Советы по отладке .htaccess
см. в этом сообщении StackOverflow.
Правила перезаписи записываются с помощью регулярных выражений. Чтобы стать экспертом, ознакомьтесь с этим руководством по регулярным выражениям.
Для быстрого анализа шаблонов регулярных выражений воспользуйтесь онлайн-отладчиком, который может предоставить немедленную обратную связь и живую интерпретацию шаблонов регулярных выражений.