Поиск по сайту:

Как настроить mod_rewrite для Apache в Ubuntu 14.04


Введение

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

Это руководство разделено на две части: в первой настраивается пример веб-приложения, а во второй объясняются часто используемые правила перезаписи.

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • Одна свежая капля Ubuntu 14.04
  • Пользователь sudo без полномочий root, которого можно настроить, выполнив шаги 2 и 3 этого руководства.

Шаг 1 — Установка Apache

На этом шаге мы будем использовать встроенный установщик пакетов под названием apt-get. Это значительно упрощает управление и облегчает чистую установку.

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

  1. sudo apt-get update

Apache2 — это вышеупомянутый HTTP-сервер, наиболее часто используемый в мире. Чтобы установить его, выполните следующее:

  1. sudo apt-get install apache2

Информацию о различиях между Nginx и Apache2, двумя наиболее популярными веб-серверами с открытым исходным кодом, см. в этой статье.

Шаг 2 — Включение mod_rewrite

Теперь нам нужно активировать mod_rewrite.

  1. sudo a2enmod rewrite

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

  1. sudo service apache2 restart

Шаг 3 — Настройка .htaccess

В этом разделе мы настроим файл .htaccess для более простого управления правилами перезаписи.

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

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

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

  1. 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.

  1. sudo service apache2 restart

Теперь создайте файл .htaccess.

  1. sudo nano /var/www/html/.htaccess

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

/var/www/html/.htaccess
RewriteEngine on

Сохраните и закройте файл.

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

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

Теперь у вас есть рабочий файл .htaccess для управления правилами маршрутизации вашего веб-приложения.

Шаг 4 — Настройка файлов

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

Мы начнем с создания файла с именем about.html.

  1. 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.

  1. sudo nano /var/www/html/.htaccess

После первой строки добавьте следующую.

/var/www/html/.htaccess
RewriteRule ^about$ about.html [NC]

Теперь ваш файл должен быть идентичен следующему.

/var/www/html/.htaccess
RewriteEngine 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/.htaccess
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer

Вышеизложенное говорит само за себя, так как фактически сопоставляет shirt/summer с results.php?item=shirt&season=summer. Это позволяет достичь желаемого эффекта.

Пример 1B: варианты сопоставления

Однако мы хотели бы обобщить это, чтобы включить все сезоны. Итак, мы будем делать следующее:

  • Укажите ряд параметров, используя логическое значение |, что означает \ИЛИ
  • Сгруппируйте соответствие с помощью (), затем укажите ссылку на группу с помощью $1, при этом 1 для первой совпавшей группы

Правило перезаписи теперь выглядит так:

/var/www/html/.htaccess
RewriteRule ^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/.htaccess
RewriteRule ^([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/.htaccess
RewriteRule ^([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/.htaccess
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^admin/(.*)$ /admin/home

Это перенаправит что-то вроде /admin/blargh на /admin/home.

С вышеизложенным:

  • %{REQUEST_FILENAME} – строка для проверки
  • !-f использует оператор ! not в имени файла
  • RewriteRule перенаправляет все запросы обратно в /admin/home

Обратите внимание, что более синтаксически и технически правильным подходом было бы определение 404 ErrorDocument.

/var/www/html/.htaccess
ErrorDocument 404 /error.html

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

Хотя это также может быть достигнуто с помощью других методов, RewriteCond можно использовать для ограничения доступа к одному IP-адресу или набору IP-адресов.

В этом примере блокируется трафик отовсюду, кроме 12.34.56.789.

/var/www/html/.htaccess
RewriteCond %{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/.htaccess
RewriteCond %{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.

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

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