На этом уроке, мы научиться управлять перезаписью URL с помощью Apache 2 и модуля mod_rewrite
. Этот модуль позволяет переписать URL – адреса в более чистой манере, переводя удобочитаемые пути в кодовые дружественных строки запроса или перенаправляют URL – адреса на основе дополнительных условий.
Это руководство разделено на две части. Первая устанавливает пример веб-сайта и показывает простой пример перезаписи. Вторая часть содержит еще два углубленных примера, часто используемых правил перезаписи.
Следуя этому руководству, вам потребуется:
Во- первых, нам нужно активировать mod_rewrite
. Он доступен, но не включен с чистой установкой Apache 2.
sudo a2enmod rewrite
Он активирует модуль или предупреждает вас о том, что модуль уже включен. Чтобы изменения вступили в силу, перезапустите Apache.
sudo systemctl restart apache2
mod_rewrite
теперь полностью включен. На следующем шаге мы создадим файл .htaccess
, который мы будем использовать, чтобы определить правила перезаписи для редиректа.
Файл .htaccess
позволяет изменять наши правила перезаписи без доступа к файлам конфигурации сервера. По этой причине, .htaccess
имеет решающее значение для безопасности вашего веб – приложения. Период, который предшествует имени файла гарантирует, что файл скрыт.
.htaccess
можно также поместить непосредственно в файлы конфигурации сервера. На самом деле, официальная документация Apache рекомендует использовать файлы конфигурации сервера, а не .htaccess
потому, что Apache обрабатывает их быстрее.Тем не менее, в этом простом примере, увеличение производительности будет незначительным. Кроме того, устанавливая правила .htaccess
удобно, особенно с нескольких веб – сайтами на одном сервере. Она не требует перезагрузки сервера, чтобы изменения вступили в силу , и это не требует привилегий суперпользователя для редактирования этих правил, что упрощает техническое обслуживание и внесение изменений и возможные с непривилегированных аккаунтов. Некоторые популярные программы с открытым исходным кодом, такие как WordPress и Joomla, часто полагается на файл .htaccess
в программном обеспечении, чтобы изменять и создавать дополнительные правила по требованию.
Нам нужно будет установить и обеспечить еще несколько настроек, прежде чем мы сможем начать.
По умолчанию Apache запрещает использование файла .htaccess
для применения правил перезаписи, поэтому сначала вам нужно разрешить изменения в файл. Открыть файл конфигурации по умолчанию в Apache, используя nano
или ваш любимый текстовый редактор.
sudo nano /etc/apache2/sites-available/000-default.conf
Внутри этого файла вы найдете блок <VirtualHost *:80>
, начиная с первой строки. Внутри этого блока, добавьте следующий новый блок , чтобы ваш файл конфигурации выглядит следующим образом . Убедитесь , что все блоки правильно с отступом.
<VirtualHost *:80> <Directory /var/www/html> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted </Directory> . . . </VirtualHost>
Сохраните и закройте файл. Чтобы изменения вступили в силу, перезапустите Apache.
sudo systemctl restart apache2
Теперь создайте файл .htaccess
в корневой веб директории.
sudo nano /var/www/html/.htaccess
Добавьте эту строку в верхней части нового файла, чтобы активировать перезапись.
RewriteEngine on
Сохраните файл и выйдите.
Теперь у вас есть оперативный файл .htaccess
, который можно использовать для управления правилами маршрутизации вашего веб – приложения. На следующем этапе мы создадим образцы файлов сайта, которые мы будем использовать, чтобы продемонстрировать правила перезаписи.
Здесь мы установим базовую перезапись URL, которая преобразует URL – адреса в реальные пути к коду. В частности, мы будем разрешать пользователям доступ. http://your_server_ip/about
Начнем с создания файла с именем about.html
в корневой директории веб.
sudo nano /var/www/html/about.html
Скопируйте следующий HTML-код в файл, а затем сохраните и закройте его.
<html> <head> <title>О нас</title> </head> <body> <h1>О нас</h1> </body> </html>
Вы можете получить доступ к странице http://your_server_ip/about.html, но обратите внимание, что если вы попытаетесь получить доступ к http://your_server_ip/about, вы увидите ошибку 404 Not Found. Но чтобы пользователи получили доступ к странице с помощью about вместо того, чтобы, переписать правила позволит эта самая функциональность.
RewriteRules
соблюдает следующий формат:
RewriteRule pattern substitution [flags]
RewriteRule
определяет директиву.pattern
является регулярное выражение, которое соответствует желаемой строки из URL, типы просмотра в браузере.substitution
это путь к реальному URL, то есть путь файловых серверов Apache.flags
необязательные параметры, которые можно изменять, как работает правило.Откройте файл .htaccess
.
sudo nano /var/www/html/.htaccess
После первой строки, добавьте RewriteRule
отмеченный красным цветом, и сохраните файл.
RewriteEngine on RewriteRule ^about$ about.html [NC]
В этом случае, ^about$
это шаблон, about.html
это замена, и [NC]
является флагом. Наш пример использует несколько символов со специальным значением:
^
указывает на начало URL, после your_server_ip/
.$
указывает на конец URL.about
соответствует строке “about”.about.html
является фактическим файл, который обращается к пользователю.[NC]
является флагом, который делает случай правила нечувствительным.Теперь, вы должны иметь возможность доступа к 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
с простым правилом, вы можете изменить и расширить для ваших потребностей. В следующих разделах мы покажем два дополнительных примера наиболее часто используемых директив.
Веб – приложения часто используют строки запроса, которые добавляются к 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 [QSA]
shirt/andreyex
явно сопоставляются в запрашиваемом адресе и Apache указал запустить вместо этого results.php?item=shirt&author=andreyex
.
флаги [QSA]
обычно используются в правила[ перезаписи. Они говорят Apache, чтобы добавить любые дополнительные строки запроса к обслуживаемому URL. Без этого, дополнительная строка запроса будет отбрасываются. http://example.ru/shirt/andreyex?page=2
results.php?item=shirt&author=andreyex&page=2
Хотя этот метод позволяет достичь желаемого эффекта, как имя элемента и author жестко закодированы в правила. Это означает, что правило не будет работать для любыми другими предметами, например pants
, или author, как destroyer
.
Для того, чтобы сделать правило более общо, мы можем использовать регулярные выражения, чтобы соответствовать части исходного адреса и использовать те части в схеме замещения. Модифицированное правило будет выглядеть следующим образом :
RewriteRule ^([A-Za-z0-9]+)/(andreyex|destroyer|fall|spring) results.php?item=$1&author=$2 [QSA]
Первое регулярное выражение группы в скобках соответствует строке, содержащей буквенно-цифровые символы и цифры, как 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 правильно переписать с использованием единого правила.
Правила перезаписи не обязательно всегда вычисляются один за другим без каких – либо ограничений. Директива RewriteCond
позволяет нам добавлять условия для наших правил перезаписи, чтобы контролировать, когда правила будут обработаны. RewriteConds
соблюдает следующий формат:
RewriteCond TestString Condition [Flags]
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
, посмотрите на введение в mod_rewrite Apache и официальной документации Apache для mod_rewrite.