Как настроить mod_rewrite для Apache на CentOS 7

Вступление

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.

Related