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

Вступление

В этом уроке мы активируем и научимся управлять перезаписью URL с помощью модуля Apache 2 + mod_rewrite +. Этот модуль позволяет нам переписывать URL-адреса более понятным способом, переводя удобочитаемые пути в удобные для кода строки запросов или перенаправляя URL-адреса на основе дополнительных условий.

Это руководство разделено на две части. Первый устанавливает пример веб-сайта и охватывает простой пример переписывания. Вторая часть содержит еще два подробных примера часто используемых правил перезаписи.

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

Шаг 1 - Включение mod_rewrite

Для начала нам нужно активировать + mod_rewrite. Он доступен, но не включен при чистой установке Apache 2.

sudo a2enmod rewrite

Это активирует модуль или предупредит вас, что модуль уже включен. Чтобы эти изменения вступили в силу, перезапустите Apache.

sudo systemctl restart apache2

+ mod_rewrite + теперь полностью включен. На следующем шаге мы настроим файл «+ .htaccess +», который будем использовать для определения правил перезаписи для перенаправлений.

Шаг 2 - Настройка .htaccess

Файл + .htaccess + позволяет нам изменять наши правила перезаписи, не обращаясь к файлам конфигурации сервера. По этой причине + .htaccess + имеет решающее значение для безопасности вашего веб-приложения. Точка, предшествующая имени файла, гарантирует, что файл скрыт.

Нам нужно будет настроить и обезопасить еще несколько параметров, прежде чем мы сможем начать.

По умолчанию Apache запрещает использовать файл + .htaccess + для применения правил перезаписи, поэтому сначала необходимо разрешить изменения в файле. Откройте файл конфигурации Apache по умолчанию, используя + nano + или ваш любимый текстовый редактор.

sudo nano /etc/apache2/sites-available/000-default.conf

Внутри этого файла вы найдете блок + <VirtualHost *: 80> +, начинающийся с первой строки. Внутри этого блока добавьте следующий новый блок, чтобы ваш файл конфигурации выглядел следующим образом. Убедитесь, что все блоки имеют правильные отступы.

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>






   . . .
</VirtualHost>

Сохраните и закройте файл. Чтобы эти изменения вступили в силу, перезапустите 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 + в корневом веб-каталоге.

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 + - необязательные параметры, которые могут изменить работу правила.

Откройте файл + .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 + может быть ничего, используя символ + $ +.

  • + 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 + могут использоваться один за другим, и при поведении по умолчанию все должны иметь значение true, чтобы учитывать следующее правило.

В качестве примера, давайте предположим, что вы хотели бы перенаправить все запросы к несуществующим файлам или каталогам на вашем сайте обратно на домашнюю страницу вместо отображения стандартной страницы ошибки * 404 Not Found *. Это может быть достигнуто с соблюдением следующих правил:

Перенаправить все запросы на несуществующие файлы и каталоги на домашнюю страницу

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

С вышеупомянутым:

  • +% {REQUEST_FILENAME} + - строка для проверки. В данном случае это запрошенное имя файла, которое является системной переменной, доступной для каждого запроса.

  • + -f + - это встроенное условие, которое проверяет, существует ли запрошенное имя на диске и является ли оно файлом. +! + Является оператором отрицания. В сочетании +! - f + оценивается как true, только если указанное имя не существует или не является файлом.

  • Аналогично, +! - d + оценивается как true, только если указанное имя не существует или не является каталогом.

+ RewriteRule + в последней строке вступит в силу только для запросов к несуществующим файлам или каталогам. + RewriteRule + сам по себе очень прост и перенаправляет каждый запрос в корень сайта + / +.

Заключение

+ mod_rewrite + - это полезный модуль Apache, который можно эффективно использовать для обеспечения удобочитаемых 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