Ubuntu включить mod rewrite

Обновлено: 05.07.2024

sudo apt-get install libapache2-mod-php5
sudo a2enmod php5

Без этого пакета при обращении к вашему сайту (предполагается, что в корне лежит индексный php-файл), веб-сервер будет предлагать вам сохранить копию корневого php-файла.

cd /etc/apache2/sites-av*

и далее создать файл конфигурации для нашего сайта (я использую редактор nano)

sudo nano test

В нем пропишем на первых порах следующие настройки:

<VirtualHost *:80>
DocumentRoot /var/www/
ServerName test.ru
ServerAdmin test@gmail.com
<Directory /var/www/>
DirectoryIndex index.php
AllowOverride All
</Directory>
<FilesMatch "^\.ht">
Order allow,deny
Allow from all
Satisfy All
</FilesMatch>
</VirtualHost>

Сохраняем внесенные настройки. Далее деактивируем первоначальный сайт и активируем наш тестовый сайт

Для предупреждения такого рода ошибки

apache2: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

ServerName localhost

Я выбрал второй вариант. Также сюда можно поместить и такие настройки

Но это можно будет сделать и в .htaccess. Далее внесем имя сайта в список хостов сервера

sudo nano /etc/hosts

и впишем через пробел имя нашего сайта

Далее очищаем директорию /var/www и создаем корневой php-файл - index.php - вот с таким содержимым:

sudo /etc/init.d/apache2 restart

/etc/php5/apache2/php.ini

Далее создаем файл .htaccess в той же директории, где расположен index.php и добавляем в него следующие правила (так как в файле конфигурации в Directory указано - AllowOverride All, значит .htaccess будет переопределять все директивы apache)

AddDefaultCharset utf8
RewriteEngine On
RewriteRule ^([a-zA-Z0-9]+)/(.*)$ index.php?path1=$1&var=2&param=% [L]
RewriteRule ^([a-zA-Z0-9]*)$ index.php?path1=$1&var=1&param=% [L]

Для проверки работы данных правил добавим в index.php следующие строчки

AddDefaultCharset utf8
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^([a-zA-Z0-9]+)/(.*)$ index.php?path1=$1&var=2&param=% [L]
RewriteRule ^([a-zA-Z0-9]*)$ index.php?path1=$1&var=1&param=% [L]
</IfModule>

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

sudo a2enmod rewrite

И снова проверяем работу правил htaccess. Все должно непременно заработать.
Если после настройки веб-сервера, что-то все-таки будет работать некорректно, стоит переустановить apache. Для его удаления введите команду

sudo apt-get purge apache2 apache2-utils apache2.2-bin apache2-common

Этичный хакинг и тестирование на проникновение, информационная безопасность

Оглавление. Полное руководство по mod_rewrite

8. Директива RewriteOptions, технические подробности, когда НЕ использовать mod_rewrite

Что такое mod_rewrite

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

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

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

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

Для чего нужен mod_rewrite / Что умеет mod_rewrite

Слово «rewrite» в названии модуля буквально означает «перезапись». Эта «перезапись» относится к URL (адресу сайта, страницы, файла). Перезапись (преобразование) происходит между тем, что введено в строке браузера пользователя (фактически, отправлено на веб-сервер) и тем, что веб-сервер получит на самом деле.

Наглядным примером применения mod_rewrite являются ЧПУ (аббр. от «человекопонятный URL») - URL-путь, состоящий из понятных слов, вместо идентификаторов, и отражающий файловую структуру сайта. Например, вместо /c14/3/97/ или /index.php?cat=10&subcat=2&id=41 будет /product/phone/Samsung/.

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

Слеши (/) на веб-сервере разделяют вложенные подпапки. Но в случае с ЧПУ если в адресе страницы встречается строка /product/phone/Samsung/, то это не означает, что на веб-сайте действительно имеется папка product, в которой подпапка phone и в которой подпапка Samsung. Благодаря mod_rewrite строка вида /product/phone/Samsung/ перезаписывается в строку вида index.php?category=product&type=phone&brand=Samsung. Таким образом, пользователь набирает в веб-браузере, либо переходит по ссылке с удобным для его восприятия адресом, а веб-сервер получает данные в понятном для обработки виде, когда каждой переменной присваивается соответствующее значение и эти переменные передаются в скрипт веб-сервера для обработки, либо отображения информации.

Это очень популярное, но не единственное применение mod_rewrite. Этот модуль умеет делать перезапись на основе разных данных: к примеру, на основе типа браузера. Это позволяет показывать разные страницы в зависимости от типа браузера, IP адреса, языка пользователя, установленных кукиз и т.д.

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

mod_rewrite умеет запрещать доступ к определённым ресурсам, как по определённому условию, так и безусловно. Т.е. вы можете настроить контроль доступа, закрыв определённые страницы для всех пользователей, либо на основе их стран, языка, веб-браузера и т.д.

На самом деле – это не всё, что умеет mod_rewrite! И даже в этом мануале вы встретитесь с дополнительными примерами применения mod_rewrite.

Прежде чем мы перейдём к теории и практики использования mod_rewrite, нужно включить модуль mod_rewrite для веб-сервера, либо убедиться, что mod_rewrite уже включен. Если вы используетесь shared (совместным) хостингом, то у большинства хостеров этот модуль включен по умолчанию. Ниже показано, как включить этот модуль на своём собственном локальном (домашнем) сервере, либо веб-сервере на VPS.

Включение mod_rewrite

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

Поскольку для большинства ситуаций удобнее использовать именно .htaccess, то для работы mod_rewrite нам нужно:

  • включить непосредственно сам mod_rewrite
  • включить поддержку файлов .htaccess

Если вы используете Debian, Ubuntu, Linux Mint, Kali Linux то mod_rewrite можно включить следующей командой:

В Debian, Ubuntu, Linux Mint, Kali Linux эта группа строк выглядит так:

В этой группе строк замените


В Windows она может выглядеть так:

В этой группе строк замените


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

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

Также должна быть включена опция Options FollowSymLinks (по умолчанию она включена). Если FollowSymLinks отключено, то невозможно использовать движок перезаписи. Это ограничение продиктовано причинами безопасности.

Журнал (логи) преобразований mod_rewrite

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

Тема логов Apache сама по себе довольно объёмная, не будем на ней заострять внимание. Но необходимо упомянуть, что если вы работали с предыдущими версиями mod_rewrite и использовали директивы RewriteLog и RewriteLogLevel, то теперь их функциональность полностью заменена директивой LogLevel, которая настраивать логи всего веб-сервера и всех модулей.

По умолчанию LogLevel установлено показывать предупреждение, в конфигурационном файле Apache это строка:

Можно заменить эту строку на:

Директивы RewriteEngine и RewriteRule

Модуль mod_rewrite использует несколько директив, и в этом руководстве мы рассмотрим их все. Но в каждом примере мы неизменно будем использовать две главные директивы, это RewriteEngine и RewriteRule. Первая директива, в виде

просто включает использование mod_rewrite в файле .htaccess.

Значение директивы можно установить на off:

В этом случае правила, которые следуют после отключения RewriteEngine off, не будут задействованы. Отключение RewriteEngine можно использовать вместо удаления или комментирования строк с правилами RewriteRule.

Конфигурации перезаписи не наследуются виртуальными хостами. Это означает, что нужно иметь директиву RewriteEngine on для каждого виртуального хоста, на которым вы хотите использовать правила перезаписи.

А вторая директива RewriteRule является главной рабочей лошадкой этого модуля. Именно с её помощью мы будем устанавливать правила перезаписи.

Она используется следующим образом:

Шаблон – это то, что мы ищем в передаваемом URL.

Подстановка – это новая строка, которая передаётся веб-серверу в том случае, если в исходных данных найдено совпадение с Шаблоном.

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

Шаблон RewriteRule

В качестве Шаблона используется регулярное выражение, которое представляет собой способ описать текст, который считается подходящим (совпадающим с шаблоном). Шаблоны можно выразить словами, например, «все слова, которые начинаются с буквы A» или «каждый десятизначный телефонный номер» или «каждое предложение с двумя запятыми и без заглавных букв Q».

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

Они позволяют описывать различные условия очень гибким способом, например: все файлы .jpg и .jpg в любой директории "images" можно записать как "/images/.*(jpg|gif)$".

Более подробно регулярным выражениемя (шаблонам) посвящена вся вторая часть данного руководства.

Какая часть запроса проверяется на совпадение с Шаблоном?

В контексте VirtualHost Шаблон первоначально проверяется на соответствие с частью URL после имени хоста (hostname) и номера порта и до строки запроса (т.е. к примеру "/app1/index.html"). Это (%-кодированный) URL-путь.

В контексте директорий (Directory и .htaccess), Шаблон проверяется на совпадение только с частью пути, к примеру, запрос "/app1/index.html" может привести к сравнению по "app1/index.html" или "index.html" в зависимости от того, где определено RewriteRule.

Путь до директории, где определено правило, отбрасывается из анализируемого запроса (вплоть до и включая конечный слэш). В конечном счёте, правилу для сравнения передаётся строка «ниже» папки, где определено правилов.

Если вам нужно искать совпадения в имени хоста, порту или строке запроса после ? (вопросительного знака), используйте RewriteCond (эта директива будет рассмотрена в четвёртой части данного руководства) с переменными % , % или % соответственно.

Подстановка RewriteRule

Подстановка правила перезаписи – это строка, которая заменяет оригинальный URL-путь, который совпал с Шаблоном. В качестве подстановки может быть:

Указывает местоположение в файловой системе ресурса, который будет доставлен клиенту. Подстановки обрабатываются как путь к файловой системе, когда правило настроено в контексте сервера (virtualhost), и первый компонент пути в подстановке существует в файловой системе.

Относительный DocumentRoot путь к ресурсу, который будет обслуживаться. Обратите внимание, что mod_rewrite пытается угадать, указали ли вы путь файловой системы или URL-путь, проверяя, существует ли первый сегмент пути в корне файловой системы. Например, если вы укажете строку Подстановки /www/file.html, это будет рассматриваться как путь URL-адреса, если директория с именем www не существует в корне вашей файловой системы (или в случае использования перезаписи в файле .htaccess относительно вашего корня документов), в последних случаях это будет рассматриваться как путь в файловой системе. Если вы хотите, чтобы другие директивы сопоставления URL (такие как Alias) применялись к результирующему URL-адресу, используйте флаг [PT], как описано в третьей части данного руководства.

Если указан абсолютный URL, mod_rewrite проверяет, совпадает ли имя хоста с текущим хостом. Если да, то схема и имя хоста отбрасываются и результирующий путь трактуется как URL-путь. В противном случае, выполняется внешний редирект (перенаправление) для заданного URL. Для принудительного внешнего редиректа на текущий хост (чтобы запрашиваемая страница поменяла адрес на другую страницу этого же хоста), смотрите флаг [R], описанный далее.

Чёрточка говорит о том, что не должна выполняться какая-либо подстановка (существующий путь должен быть пропущен нетронутым). Это используется когда нужно применить флаг (смотрите далее) без изменения пути.

В дополнении к простому тексту, строка Подстановки может включать:

  1. обратную ссылку ($N) на шаблон RewriteRule
  2. обратную ссылку (%N) на последний совпавший шаблон RewriteCond
  3. серверные переменные как в тестовых строках условия правила (%)
  4. вызов функции сопоставления (mapping) ($)

Директива RewriteBase

Мы уже выяснили, что на совпадение проверяется только часть запроса – начиная от текущий папки и далее вложенные подпапки. Если Подстановкой, получившейся в результате перезаписи, является относительный путь, то чтобы найти этот ресурс, к полученному значению добавляется путь до текущей папки. Это является поведением по умолчанию, а директива RewriteBase позволяет изменить это поведение.

Директива RewriteBase определяет URL префикс, используемый для постановки перед относительным путём.

Обычно, эта директива не требуется. Но она нужна когда:

Логика работы mod_rewrite

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

Это так, но это не всё. Если указано несколько правил RewriteRule и, допустим, в запросе найдено совпадение с первым правилом и исходная строка запроса изменена в соответствии с этим правилом. Второму правилу передаётся не исходная строка запроса, а новая строка, получившаяся в результате обработки всеми предыдущими правилами. И также происходит ниже по цепочке.

Проверку по всем правилам можно назвать проходом (раундом, циклом). Если в данном раунде случилось хотя бы одно совпадение (сработало правило), то после завершения прохода начинается ещё один круг проверки по этим же самым правилам! Это неочевидно и мало где об этом говориться – поэтому обратите на это особое внимание. Т.е. на новый раунд передаётся уже изменённая строка запроса и именно она проходит оценку по всем правилам. И вновь: если сработало хотя бы одно правило, идёт заход на новый круг и т.д.

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

Тестирование правил mod_rewrite

Для тестов, на вашем веб-сервере в папке сайтов создайте новую папку mr, к примеру, на Windows это может быть каталог C:\Server\data\htdocs\mr\, а на Linux это /var/www/html/mr/

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

Требования

  • Сервер Ubuntu 14.04.
  • Пользователь с доступом к sudo (подробности можно найти в руководстве Добавление и удаление пользователей в Ubuntu 14.04).

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:

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

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

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

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

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

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

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

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

sudo nano /var/www/html/.htaccess

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

RewriteRule ^about$ about.html [NC]

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

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

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

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

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

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

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

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

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

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

RewriteRule pattern substitution [flags]

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

ErrorDocument 404 /error.html

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

Основным функциональным модулем для Apache, который позволяет переписывать URL-запросы в удобные для кода строки, является mod_rewrite. Настройка модуля осуществляется набором правил, который описан либо в конфигурации вашего сервера, либо в файлах .htaccess. Далее о том, как переписать URL-адреса с помощью mod_rewrite для Apache в Ubuntu 20.04.

Основным файлом, на ряду с модулем mod_rewrite, который позволяет осуществлять перезаписи запросов, изменять доступ к страницам и многое другое, в соответствии с заданными правилами, является .htaccess.

Этот файл необходимо размещать в корневом каталоге сайта, чтобы он мог функционировать с заданными для него свойствами.

В этой статье, мы отразим необходимую информацию, в которой рассмотрим основные моменты работы модуля mod_rewrite и .htaccess.

  • Настроенный VPS с Ubuntu Server 20.04
  • Установленный веб-сервер

Запуск модуля mod_rewrite.

Как правило, модуль mod_rewrite уже установлен в системе, и для дальнейшего его использования веб-сервером Apache, нам нужно только запустить его. Для включения модуля воспользуемся командой a2enmod:

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

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

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

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

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

Дополним блок <VirtualHost *:80> следующими настройками:

Сохраним наши настройки, выйдем из редактора и перезапустим сервер Apache:

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

Первым нашим правилом, которое мы должны добавить в файл .htaccess для активации RewriteEngine , будем следующая строка:

Здесь необходимо сохранить и выйти из редактирования файла.

Настройка перезаписи URL-адресов

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

Наполнить index.html файл следующим HTML-кодом:

Web-страница - как переписать URL-адреса с помощью mod_rewrite для Apache в Ubuntu 20.04

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

Все правила перезаписи RewriteRules имеют следующий формат:

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

Теперь отредактируем файл .htaccess:

Здесь у нас уже имеется одно правило. Наполним следующим правилом и затем сохраним наши изменения:

В нашем случае ^index$ — это шаблон, index.html – путь к файлу, а [NC] – флаг. Теперь, более подробно про правило, которое мы использовали, по частям:

URL-адреса, указанные ниже, работать не будут:

В данных примерах мы увидели, каким образом работает правило перезаписи ссылок и для чего необходим файл .htaccess , и узнали, как переписать URL-адреса при помощи mod_rewrite для Apache в Ubuntu 20.04.

dimanao.org

Настройка mod_rewrite на Apache2 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:

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

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

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

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

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

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

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

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

sudo nano /var/www/html/.htaccess

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

RewriteRule ^about$ about.html [NC]

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

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

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

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

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

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

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

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

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

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

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

RewriteRule pattern substitution [flags]

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

ErrorDocument 404 /error.html

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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