Вступление
Модуль Apache + mod_rewrite +
позволяет вам переписывать URL более чистым способом, переводя удобочитаемые пути в удобные для кода строки запросов. Это также позволяет переписать URL-адреса в зависимости от условий.
Файл + .htaccess +
позволяет создавать и применять правила перезаписи без доступа к файлам конфигурации сервера. Поместив файл + .htaccess +
в корень вашего веб-сайта, вы можете управлять перезаписью для каждого сайта или для каждого каталога.
В этом руководстве вы включите + mod_rewrite +
и будете использовать файлы + .htaccess +
для создания основного перенаправления URL-адреса, а затем исследуете несколько расширенных вариантов использования.
Предпосылки
Чтобы следовать этому уроку, вам понадобится:
-
Один сервер Debian 9 настроен в соответствии с инструкциями по начальной настройке сервера Debian 9, включая пользователя sudo без полномочий root и брандмауэр.
-
Apache установлен, выполнив шаги 1 и 2 из How для установки веб-сервера Apache на Debian 9.
Шаг 1 - Включение mod_rewrite
Чтобы Apache понимал правила перезаписи, нам сначала нужно активировать + mod_rewrite +
. Он уже установлен, но он отключен при установке Apache по умолчанию. Используйте команду + a2enmod +
для включения модуля:
sudo a2enmod rewrite
Это активирует модуль или предупредит вас, что модуль уже включен. Чтобы эти изменения вступили в силу, перезапустите Apache:
sudo systemctl restart apache2
+ mod_rewrite +
теперь полностью включен. На следующем шаге мы настроим файл «+ .htaccess +», который будем использовать для определения правил перезаписи для перенаправлений.
Шаг 2 - Настройка .htaccess
Файл + .htaccess +
позволяет нам изменять наши правила перезаписи, не обращаясь к файлам конфигурации сервера. По этой причине + .htaccess +
имеет решающее значение для безопасности вашего веб-приложения. Точка, предшествующая имени файла, гарантирует, что файл скрыт.
Перед тем, как вы начнете использовать файлы + .htaccess +
, вам нужно установить и защитить еще несколько настроек.
По умолчанию Apache запрещает использовать файл + .htaccess +
для применения правил перезаписи, поэтому сначала необходимо разрешить изменения в файле. Откройте файл конфигурации Apache по умолчанию, используя + nano +
или https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9#step-six-%E2%80%94-completing -optional-configuration [ваш любимый текстовый редактор]:
sudo nano /etc/apache2/sites-available/000-default.conf
Внутри этого файла вы найдете блок + <VirtualHost *: 80> +
, начинающийся с первой строки. Внутри этого блока добавьте следующий новый блок, чтобы ваш файл конфигурации выглядел следующим образом. Убедитесь, что все блоки имеют правильные отступы.
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
. . .
</VirtualHost>
Сохраните и закройте файл.
Проверьте свою конфигурацию:
sudo apache2ctl configtest
Если ошибок нет, перезапустите Apache, чтобы изменения вступили в силу:
sudo systemctl restart apache2
Теперь создайте файл + .htaccess +
в корне сети:
sudo nano /var/www/html/.htaccess
Добавьте эту строку вверху нового файла, чтобы активировать механизм перезаписи.
/var/www/html/.htaccess
RewriteEngine on
Сохраните файл и выйдите.
Теперь у вас есть рабочий файл + .htaccess +
, который вы можете использовать для управления правилами маршрутизации вашего веб-приложения. На следующем шаге мы создадим образцы файлов веб-сайта, которые мы будем использовать для демонстрации правил перезаписи.
Шаг 3 - Настройка перезаписи URL
Здесь мы настроим базовую перезапись URL, которая преобразует красивые URL в реальные пути к страницам. В частности, мы дадим пользователям доступ к + http: /// about +
и отобразим страницу с названием + about.html +
.
Начните с создания файла с именем + about.html +
в корневом веб-каталоге:
sudo nano /var/www/html/about.html
Скопируйте следующий HTML-код в файл, затем сохраните и закройте его.
/var/www/html/about.html
<html>
<head>
<title>About Us</title>
</head>
<body>
<h1>About Us</h1>
</body>
</html>
Вы можете получить доступ к этой странице по адресу + http: /// about.html +
, но обратите внимание, что если вы попытаетесь получить доступ к + http: /// about +
, вы увидите ошибку * 404 Not Found *. Чтобы получить доступ к странице с помощью + / about +
, мы создадим правило перезаписи.
Все + RewriteRules +
следуют этому формату:
Общая структура RewriteRule
RewriteRule pattern substitution [flags]
-
+ RewriteRule +
определяет директиву. -
+ pattern +
- это regular выражение, которое совпадает с желаемой строкой из URL, то есть то, что зритель печатает в браузер. -
+ substitution +
- это путь к фактическому URL, т.е. путь к файлу, который обслуживает Apache. -
+ flags +
- необязательные параметры, которые могут изменить работу правила.
Давайте создадим наше правило перезаписи URL. Откройте файл + .htaccess
:
sudo nano /var/www/html/.htaccess
После первой строки добавьте следующий + RewriteRule +
и сохраните файл:
/var/www/html/.htaccess
RewriteEngine on
В этом случае + ^ about $ +
является шаблоном, + about.html +
является заменой, а + [NC] +
является флагом. В нашем примере используются несколько символов со специальным значением:
-
+ ^ +
указывает начало URL после+ / +
. -
+ $ +
указывает на конец URL. -
+ about +
соответствует строке «about». -
+ about.html +
- это фактический файл, к которому обращается пользователь. -
+ [NC] +
- это флаг, который делает правило нечувствительным к регистру.
Теперь вы можете получить доступ к + http: /// about +
в вашем браузере. Фактически, с правилом, показанным выше, следующие URL также будут указывать на + about.html +
:
-
+ http: /// about +
из-за определения правила. -
+ http: /// About +
, потому что правило нечувствительно к регистру. -
+ http: /// about.html +
, потому что оригинальное имя файла всегда будет работать.
Однако следующее не будет работать:
-
+ http: /// about / +
, поскольку в правиле прямо указано, что после+ about +
может не быть ничего, поскольку символ+ $ +
появляется после+ about +
. -
+ http: /// contact +
, поскольку он не будет соответствовать строке+ about +
в правиле.
Теперь у вас есть рабочий файл + .htaccess +
с базовым правилом, которое вы можете изменить и расширить в соответствии со своими потребностями. В следующих разделах мы покажем два дополнительных примера часто используемых директив.
Пример 1 - Упрощение строк запроса с помощью RewriteRule
Веб-приложения часто используют query strings, которые добавляются к URL с помощью вопросительного знака (+? +
) После адреса. Отдельные параметры разделяются с помощью амперсанда (+ & +
). Строки запроса могут использоваться для передачи дополнительных данных между отдельными страницами приложения.
Например, страница результатов поиска, написанная на PHP, может использовать URL-адрес, например + http: //example.com/results.php? Item = shirt & season = summer +
. В этом примере два дополнительных параметра передаются в воображаемый прикладной скрипт + result.php +
: + item +
со значением + shirt +
и + season +
со значением + summer +
. Приложение может использовать информацию строки запроса, чтобы построить правильную страницу для посетителя.
Правила переписывания Apache часто используются, чтобы упростить такие длинные и неприятные ссылки, как в примере выше, в дружественные URL-адреса, которые проще вводить и интерпретировать визуально. В этом примере мы хотели бы упростить приведенную выше ссылку, чтобы она стала + http: // example.com / shirt / summer +
. Значения параметров + shirt +
и + summer +
по-прежнему находятся в адресе, но без строки запроса и имени скрипта.
Вот одно правило для реализации этого:
Простая замена
RewriteRule ^/$ results.php?item=&season= [QSA]
+ Shirt / summer +
явно совпадает с запрошенным адресом, и Apache должен указать вместо него + results.php? Item = shirt & season = summer +
.
Флаги + [QSA] +
обычно используются в правилах перезаписи. Они говорят Apache добавить любую дополнительную строку запроса к обслуживаемому URL, поэтому, если посетитель введет + http: //example.com/shirt/summer? +
, Сервер ответит `+ results.php? Item = shirt & season = лето + `. Без этого дополнительная строка запроса будет отброшена.
В то время как этот метод достигает желаемого эффекта, и название предмета, и сезон жестко закодированы в правиле. Это означает, что правило не будет работать для любых других элементов, таких как + брюки +
или сезонов, таких как + зима +
.
Чтобы сделать правило более общим, мы можем использовать regular выражений, чтобы соответствовать частям исходного адреса и использовать эти части в шаблон замещения. Измененное правило будет выглядеть следующим образом:
Простая замена
RewriteRule ^/ results.php?item=$1&season=$2 [QSA]
Первая группа регулярных выражений в скобках соответствует строке, содержащей буквенно-цифровые символы и цифры, такие как + shirt +
или + брюк +
, и сохраняет соответствующий фрагмент как переменную + $ 1 +
. Вторая группа регулярных выражений в скобках соответствует в точности + summer
,` + winter`, + fall
или` + spring` и аналогичным образом сохраняет сопоставленный фрагмент как + $ 2 +
.
Соответствующие фрагменты затем используются в результирующем URL-адресе в переменных + item +
и + season +
вместо жестко закодированных значений + shirt +
и + summer +
, которые мы использовали ранее.
Выше приведено, например, преобразование + http: // example.com / брюк / лето +
в + http: //example.com/results.php? Item = брюк & сезон = лето +
. Этот пример также является перспективным, позволяя корректно переписать несколько элементов и сезонов, используя одно правило.
Пример 2 - Добавление условий с помощью логики с использованием RewriteConds
Правила перезаписи не обязательно всегда оцениваются по одному без каких-либо ограничений. Директива + RewriteCond +
позволяет нам добавлять условия в наши правила перезаписи, чтобы контролировать, когда правила будут обработаны. Все + RewriteConds +
придерживаются следующего формата:
Общая структура RewriteCond
RewriteCond TestString Condition [Flags]
-
+ RewriteCond +
определяет директиву+ RewriteCond +
. -
+ TestString +
- строка для проверки. -
+ Condition +
- это шаблон или условие для сопоставления. -
+ Flags +
являются необязательными параметрами, которые могут изменять условие и правила оценки.
Если значение + RewriteCond +
равно true, будет рассмотрен следующий + RewriteRule +
. Если этого не произойдет, правило будет отменено. Несколько + RewriteCond s
могут использоваться один за другим, для всех должно быть установлено значение true, чтобы рассмотреть следующее правило.
В качестве примера, давайте предположим, что вы хотели бы перенаправить все запросы к несуществующим файлам или каталогам на вашем сайте обратно на домашнюю страницу вместо отображения стандартной страницы ошибки * 404 Not Found *. Это может быть достигнуто с соблюдением следующих правил:
Перенаправить все запросы на несуществующие файлы и каталоги на домашнюю страницу
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /
С вышеупомянутым:
-
+% {REQUEST_FILENAME} +
- строка для проверки. В данном случае это запрошенное имя файла, которое является системной переменной, доступной для каждого запроса. -
+ -f +
- это встроенное условие, которое проверяет, существует ли запрошенное имя на диске и является ли оно файлом.+! +
Является оператором отрицания. В сочетании+! - f +
оценивается как true, только если указанное имя не существует или не является файлом. -
Аналогично,
+! - d +
оценивается как true, только если указанное имя не существует или не является каталогом.
+ RewriteRule +
в последней строке вступит в силу только для запросов к несуществующим файлам или каталогам. + RewriteRule +
сам по себе очень прост и перенаправляет каждый запрос в корень сайта + / +
.
Заключение
+ mod_rewrite +
позволяет создавать удобочитаемые URL-адреса. В этом руководстве вы узнали, как использовать директиву + RewriteRule +
для перенаправления URL-адресов, в том числе со строками запроса. Вы также узнали, как условно перенаправлять URL-адреса с помощью директивы + RewriteCond +
.
Если вы хотите узнать больше о + mod_rewrite +
, взгляните на Apache’s mod_rewrite Введение и http: //httpd.apache .org / docs / current / mod / mod_rewrite.html [Официальная документация Apache для mod_rewrite].