Как переписать URL с помощью mod_rewrite для Apache на Debian 9

Вступление

Модуль 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].

Related