Вступление
Apache - это модульный веб-сервер, который позволяет настраивать его возможности, включая и отключая модули. Это дает администраторам возможность адаптировать функциональность Apache для удовлетворения потребностей своего веб-приложения.
В этом руководстве мы установим Apache на сервере CentOS 7, подтвердим, что модуль + mod_rewrite +
включен, и исследуем некоторые важные функции.
необходимое условие
Прежде чем следовать этому руководству, убедитесь, что у вас есть обычный пользователь без полномочий root с правами sudo. Подробнее о том, как настроить пользователя с этими привилегиями, вы можете узнать из нашего руководства, https://www.digitalocean.com/community/tutorials/how-to-create-a-sudo-user-on-centos-quickstart [ Как создать пользователя Sudo на CentOS.
Шаг 1 - Установка Apache
Мы установим Apache, используя + yum +
, утилиту управления пакетами по умолчанию для CentOS.
sudo yum install httpd
Когда появится сообщение с сообщением + Это нормально [y / d / N]: +
, введите + Y +
и нажмите клавишу + ENTER +
, чтобы авторизовать установку.
Затем запустите демон Apache, автономный процесс, который создает пул дочерних процессов или потоков для обработки запросов с помощью утилиты + systemctl +
:
sudo systemctl start httpd
Чтобы убедиться, что Apache успешно запущен, проверьте его состояние с помощью команды + status +
:
sudo systemctl status httpd
Output. . .
systemd[1]: Starting The Apache HTTP Server...
systemd[1]:
Когда Apache запущен и работает, давайте обратим наше внимание на его модули.
Шаг 2 - Проверка mod_rewrite
Начиная с версии 7 CentOS модуль Apache + mod_rewrite +
включен по умолчанию. Мы проверим это в случае команды + httpd +
и флага + -M +
, который выводит список всех загруженных модулей:
httpd -M
Output . . .
remoteip_module (shared)
reqtimeout_module (shared)
setenvif_module (shared)
slotmem_plain_module (shared)
. . .
Если + rewrite_module +
не появляется в выходных данных, включите его, отредактировав файл + 00-base.conf +
с помощью редактора + vi +
:
sudo vi /etc/httpd/conf.modules.d/00-base.conf
После открытия текстового файла введите + i +
, чтобы войти в режим вставки, а затем добавьте или раскомментируйте выделенную строку ниже:
/etc/httpd/conf.modules.d/00-base.conf
#
# This file loads most of the modules included with the Apache HTTP
# Server itself.
#
. . .
. . .
Теперь нажмите + ESC +
, чтобы выйти из режима вставки. Затем введите +: x +
, затем нажмите клавишу + ENTER +
, чтобы сохранить и выйти из файла.
Затем примените изменение конфигурации, перезапустив Apache:
sudo systemctl restart httpd
С установленным Apache и включенным модулем + mod_rewrite +
мы готовы настроить использование файла + .htaccess +
.
Шаг 3 - Настройка файла .htaccess
Файл + .htaccess +
позволяет определять директивы для Apache, включая + RewriteRule +
, для каждого домена без изменения файлов конфигурации сервера. В Linux файлы, которым предшествует точка (+. +
), Считаются скрытыми.
Перед использованием файла + .htaccess +
нам нужно обновить настройку + AllowOverride +
, чтобы иметь возможность перезаписывать директивы Apache.
sudo vi /etc/httpd/conf/httpd.conf
Найдите раздел + <Directory / var / www / html> +
и измените директиву + AllowOverride +
с + None +
на + All +
:
/etc/httpd/conf/httpd.conf
. . .
<Directory /var/www/html>
. . .
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
. . .
</Directory>
. . .
Сохраните и закройте файл, а затем перезапустите Apache, чтобы применить изменения:
sudo systemctl restart httpd
Затем создайте файл + .htaccess
в корне документа по умолчанию,` + / var / www / html`, для Apache.
sudo vi /var/www/html/.htaccess
Добавьте следующую строку в начало файла, чтобы активировать + RewriteEngine +
, который инструктирует Apache для обработки любых следующих правил:
/var/www/html/.htaccess
RewriteEngine On
Сохраните и выйдите из файла.
Теперь у вас есть файл + .htaccess +
, который позволит вам определять правила для манипулирования URL-адресами по мере необходимости. Прежде чем приступить к написанию настоящих правил, давайте немного рассмотрим базовый синтаксис + mod_rewrite +
.
Шаг 4 - Изучение синтаксиса RewriteRule
Директива + RewriteRule +
позволяет нам переназначить запрос к Apache, основываясь на URL. Файл + .htaccess +
может содержать более одного правила перезаписи, но во время выполнения Apache применяет правила в определенном порядке. Правило перезаписи состоит из следующей структуры:
+ RewriteRule Pattern Substitution [Flags] +
-
RewriteRule: указывает директиву
+ RewriteRule +
-
Pattern: PCRE (регулярное выражение, совместимое с Perl), которое соответствует желаемой строке. Вы можете узнать больше о регулярных выражениях here.
-
Substitution: куда должны отправляться соответствующие запросы
-
[Flags]: необязательные параметры для изменения правила. Для получения дополнительной информации о доступных флагах и их значениях см. Документацию Apache по адресу Rewrite Flags.
+ RewriteRule +
является рабочей лошадкой директив + mod_rewrite +
, поэтому в этом уроке мы в основном сосредоточимся на ней.
Шаг 5 - Изучение синтаксиса RewriteCond
Директива + RewriteCond +
позволяет нам добавлять условия в правило перезаписи. Условие перезаписи состоит из следующей структуры:
+ RewriteCond TestString Condition [Flags] +
-
RewriteCond: указывает директиву
+ RewriteCond +
-
TestString: строка для проверки
-
Condition: шаблон для сопоставления
-
[Flags]: необязательный параметр для изменения условия.
Директива + RewriteCond +
не позволяет Apache учитывать любые правила перезаписи, которые следуют ей, если конкретное условие не принимает значение true.
Шаг 6 - Настройка файлов
Мы установим базовое правило перезаписи, чтобы пользователи могли посещать страницу «+ about.html », не вводя расширение файла (« .html `) в адресной строке веб-браузера. Начните с создания файла ` about.html` в корневом каталоге документа:
sudo vi /var/www/html/about.html
Скопируйте следующий HTML-код в файл:
/var/www/html/about.html
<!DOCTYPE html>
<html>
<head>
<title>About Us</title>
</head>
<body>
<h1>About Us</h1>
</body>
</html>
Сохраните и выйдите из файла.
В веб-браузере перейдите по следующему адресу:
http:///about.html
Вы должны увидеть белую страницу с * О нас * на нем. Если вы удалите * .html * из адресной строки и перезагрузите страницу, вы получите ошибку 404 * Not Found *. Apache может получить доступ к компонентам только по их полному имени файла, но мы можем изменить это с помощью правила перезаписи.
Шаг 7 - Настройка RewriteRule
Мы бы хотели, чтобы посетители страницы * About Us * имели к ней доступ без необходимости вводить + .html +
. Для этого мы создадим правило.
Откройте файл + .htaccess
:
sudo vi /var/www/html/.htaccess
После строки + RewriteEngine On +
добавьте следующее:
/var/www/html/.htaccess
RewriteRule ^about$ about.html [NC]
Сохраните и выйдите из файла.
Теперь посетители могут получить доступ к странице * О нас * с помощью URL-адреса + http: /// about +
.
Давайте рассмотрим правило перезаписи:
+ ^ about $ +
служит шаблоном, который сопоставляется с URL и тем, что пользователь вводит в свой браузер. + В нашем примере используется пара metacharacters, чтобы гарантировать, что термин существует только в определенном месте в URL:
-
+ ^ +
указывает начало URL, после того как+ / +
удалено. -
+ & +
означает конец URL
+ about.html +
показывает путь к файлу, который обслуживает Apache, когда встречает соответствующий шаблон.
+ [NC] +
- это флаг, который инструктирует правило перезаписи без учета регистра, чтобы пользователь мог вводить строчные и прописные буквы в URL. Например, следующие URL-адреса указывают на файл + about.html +
:
-
/около
-
/Около
-
/ОКОЛО
С помощью простого правила перезаписи мы добавили динамический аспект того, как пользователи могут получить доступ к странице * О нас *.
Общие паттерны
Теперь, когда у нас есть базовое понимание правил перезаписи, мы рассмотрим два дополнительных примера в этом разделе.
Файлы примеров могут быть настроены, но это руководство не включает их создание; просто переписать сами правила.
Пример 1. Упрощение строк запроса с помощью RewriteRule
Веб-приложения часто используют строки запроса, которые добавляются к URL-адресу с помощью символа вопросительного знака (+? +
) И разделяются символом амперсанда (+ & +
). Apache игнорирует эти два символа при сопоставлении правил перезаписи. Тем не менее, иногда строки запроса могут потребоваться для передачи данных между страницами. Например, URL-адрес страницы результатов поиска, написанный на PHP, может выглядеть следующим образом:
http://example.com/results.php?item=shoes&type=women
Вместо этого мы хотели бы, чтобы наши посетители могли использовать следующий более чистый URL:
http://example.com/shoes/women
Мы можем достичь этих результатов одним из двух способов - с помощью простой замены или соответствия параметров.
-
Пример 1А: Простая замена *
Мы создадим правило перезаписи, которое выполняет простую замену, упрощая URL-адрес длинного запроса:
/var/www/html/.htaccess
RewriteRule ^shoes/women$ results.php?item=shoes&type=women
Правило отображает + shoes / women +
в + results.php? Item = shoes & type = women +
.
-
Пример 1B: Соответствующие параметры *
В некоторых случаях мы можем обобщить строку запроса, включив в нее различные типы обуви. Мы можем сделать это, выполнив следующие действия:
-
Укажите ряд параметров, используя вертикальную трубу
+ | +
, логический оператор «ИЛИ» -
Сгруппируйте совпадение, используя
+ () +
, затем ссылайтесь на группу, используя переменную+ $ 1 +
, с+ 1 +
для первой сопоставленной группы.
Правило перезаписи теперь становится:
/var/www/html/.htaccess
RewriteRule ^shoes/(men|women|youth) results.php?item=shoes&type=$1
Показанное выше правило соответствует URL + shoes / +
, за которым следует указанный тип. Это изменит исходный URL так, чтобы:
http://example.com/shoes/men
будет выглядеть так:
http://example.com/results.php?item=shoes&type=men
Эта опция сопоставления позволяет Apache оценивать несколько шаблонов без необходимости создавать отдельное правило перезаписи для каждого из них.
-
Пример 1С: Соответствие наборам символов *
Однако мы также хотели бы указать любой элемент, а не ограничивать его просто + / shoes
. Итак, мы сделаем следующее:
-
Напишите regular expression, который соответствует всем буквенно-цифровым символам. Скобочное выражение
+ [] +
соответствует любому символу внутри него, а+
соответствует любому количеству символов, указанных в скобках -
Сгруппируйте совпадение и укажите его как
+ $ 2 +
в качестве второй переменной в файле.
/var/www/html/.htaccess
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2
Приведенный выше пример преобразует:
http://example.com/pants/men
to:
http://example.com/results.php?item=pants&type=men
Мы успешно расширили возможности сопоставления, чтобы включить несколько аспектов URL.
-
Пример 1D: передача строк запроса *
В этом разделе не вводятся какие-либо новые концепции, но рассматривается проблема, которая может возникнуть. Используя приведенный выше пример, допустим, что мы хотим перенаправить + http: // example.com / брюк / мужчины +
, но передадим дополнительную строку запроса +? Page = 2 +
. Мы хотели бы отобразить следующий URL:
http://example.com/pants/men?page=2
to:
http://example.com/results.php?item=pants&type=men&page=2
Если вы попытаетесь получить доступ к указанному выше URL с нашими текущими настройками, вы обнаружите, что строка запроса + page = 2 +
теряется. Это легко исправить с помощью дополнительного флага + QSA +
, который приводит к объединению строк запроса. Изменение правила перезаписи для соответствия следующему приведет к желаемому поведению.
/var/www/html.html
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2 [QSA]
Пример 2. Добавление условий с помощью логики
Теперь мы рассмотрим использование директивы + RewriteCond +
. Если условие перезаписи принимает значение true, то Apache считает + RewriteRule +
, который следует за ним.
-
Пример 2А: Страница по умолчанию *
Ранее мы видели, как Apache обрабатывает запрос на недопустимый URL, предоставляя страницу 404 * Not Found *. Однако вместо страницы с ошибкой мы бы хотели, чтобы все неправильно сформированные URL-адреса перенаправлялись обратно на домашнюю страницу. Используя условие, мы можем проверить, существует ли запрошенный файл.
/var/www/html/.htaccess
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home
Это перенаправит что-то вроде + / admin / +
в + / admin / home +
.
Давайте рассмотрим вышеприведенное правило:
-
+% {REQUEST_FILENAME} +
проверяет запрошенную строку -
+! - f +
оператор+! +
или * not * указывает, что если запрошенное имя файла не существует, выполните следующее правило перезаписи. -
+ RewriteRule
перенаправляет запросы обратно в` + / admin / home + `
Определение 404 + ErrorDocument +
будет следовать передовой практике. Для этого мы создадим правило + ErrorDocument +
, чтобы указать 404 ошибки на страницу + error.html +
:
/var/www/html/.htaccess
ErrorDocument 404 /error.html
Это перенаправляет любой запрос, который приводит к ответу HTTP 404 на страницу + error.html
.
-
Пример 2B: ограничение IP-адреса *
+ RewriteCond +
может использоваться для предоставления доступа к сайту по определенному IP-адресу.
Этот пример блокирует трафик отовсюду *, за исключением * 198.51.100.24.
/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} !^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]
Полное правило гласит, что если IP-адрес запрашивающего ресурса не равен 198.51.100.24, то не разрешайте доступ.
Короче:
-
+% {REMOTE_ADDR} +
- строка адреса -
+! ^ (198 \ .51 \ .100 \ .24) $ +
отменяет IP-адрес. Обратные слэши+ \ +
экранируют точку+. +
, Потому что в противном случае они служат метасимволами, используемыми для сопоставления с любым символом. -
Флаг
+ F +
запрещает доступ, а флаг+ L +
указывает, что это последнее правило, которое нужно запустить, если оно выполнено.
Если вы предпочитаете * заблокировать * доступ с определенного адреса, используйте следующее:
/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]
Хотя вы можете использовать другие методы, чтобы заблокировать или разрешить трафик на ваш сайт, установка ограничения в файле + .htaccess +
является самым простым способом достижения этих результатов.
Заключение
В этом руководстве мы использовали файл + .htaccess +
для работы с директивами + RewriteRule +
и + RewriteCond +
. Существует много причин для использования правил перезаписи, и следующие ресурсы подробно описывают возможности модуля + mod_rewrite +
:
Модуль + mod_rewrite +
является важнейшим компонентом веб-сервера Apache, и с ним можно многое сделать. Однако, все не всегда идет по плану, и когда это происходит, вы можете столкнуться с циклом перенаправления или неоднозначной ошибкой «+500 запрещено +». Чтобы получить советы по устранению подобных ситуаций, просмотрите this сообщение StackOverflow.