Вступление
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.