Как переписать URL-адреса с помощью mod_rewrite для Apache в Ubuntu 16.04

Вступление

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

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

Предпосылки

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

[[step-1 -—- enable-mod_rewrite]] == Шаг 1. Включение mod_rewrite

Во-первых, нам нужно активироватьmod_rewrite. Он доступен, но не включен при чистой установке Apache 2.

sudo a2enmod rewrite

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

sudo systemctl restart apache2

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

[[step-2 -—- setting-up-htaccess]] == Шаг 2 - Настройка .htaccess

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

[.Примечание]##

Note: Любые правила, которые вы можете поместить в файл.htaccess, также можно поместить непосредственно в файлы конфигурации сервера. Фактически,official Apache documentation рекомендует использовать файлы конфигурации сервера вместо.htaccess, потому что Apache обрабатывает их быстрее.

Однако в этом простом примере повышение производительности будет незначительным. Кроме того, установка правил в.htaccess удобна, особенно с несколькими веб-сайтами на одном сервере. Он не требует перезапуска сервера, чтобы изменения вступили в силу, и не требует привилегий root для редактирования этих правил, что упрощает обслуживание и делает возможными изменения с использованием непривилегированной учетной записи. Некоторые популярные программы с открытым исходным кодом, такие как Wordpress и Joomla, часто используют файл.htaccess, чтобы программа могла изменять и создавать дополнительные правила по запросу.

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

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

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

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

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


    
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    

    . . .

Сохраните и закройте файл. Чтобы эти изменения вступили в силу, перезапустите Apache.

sudo systemctl restart apache2

Теперь создайте файл.htaccess в корневом веб-каталоге.

sudo nano /var/www/html/.htaccess

Добавьте эту строку вверху нового файла, чтобы активировать механизм перезаписи.

/var/www/html/.htaccess

RewriteEngine on

Сохраните файл и выйдите.

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

[[step-3 -—- configuring-url-rewrites]] == Шаг 3 - Настройка перезаписи URL

Здесь мы настроим базовую перезапись URL, которая преобразует красивые URL в реальные пути к коду. В частности, мы разрешим пользователям доступ кhttp://your_server_ip/about.

Начните с создания файла с именемabout.html в корневом веб-каталоге.

sudo nano /var/www/html/about.html

Скопируйте следующий HTML-код в файл, затем сохраните и закройте его.

/var/www/html/about.html


    
        About Us
    
    
        

About Us

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

ВсеRewriteRulesпридерживаются следующего формата:

Общая структура RewriteRule

RewriteRule pattern substitution [flags]
  • RewriteRule указывает директиву.

  • pattern - этоregular expression, который соответствует желаемой строке из URL-адреса, который зритель вводит в браузере.

  • substitution - это путь к фактическому URL-адресу, т.е. Путь к файлу Apache серверов.

  • flags - это необязательные параметры, которые могут изменять работу правила.

Откройте файл.htaccess.

sudo nano /var/www/html/.htaccess

После первой строки добавьтеRewriteRule, отмеченные красным, и сохраните файл.

/var/www/html/.htaccess

RewriteEngine on
RewriteRule ^about$ about.html [NC]

В этом случае^about$ - это шаблон,about.html - это подстановка, а[NC] - это флаг. В нашем примере используются несколько символов со специальным значением:

  • ^ указывает начало URL-адреса послеyour_server_ip/.

  • $ указывает конец URL-адреса.

  • about соответствует строке «о».

  • about.html - это фактический файл, к которому обращается пользователь.

  • [NC] - это флаг, который делает правило нечувствительным к регистру.

Теперь у вас должен быть доступ кhttp://your_server_ip/about в вашем браузере. Фактически, с показанным выше правилом следующие URL-адреса будут указывать наabout.html:

  • http://your_server_ip/about из-за определения правила.

  • http://your_server_ip/About, поскольку в правиле регистр не учитывается.

  • http://your_server_ip/about.html, потому что исходное имя файла всегда будет работать.

Следующего не будет:

  • http://your_server_ip/about/, потому что правило явно заявляет, что послеabout не может быть ничего, используя символ$.

  • http://your_server_ip/contact, потому что он не будет соответствовать строкеabout в правиле.

Теперь у вас есть рабочий файл.htaccess с простым правилом, которое вы можете изменить и расширить в соответствии с вашими потребностями. В следующих разделах мы покажем два дополнительных примера часто используемых директив.

[[example-1 -—- simple-query-strings-with-rewriterule]] == Пример 1. Упрощение строк запроса с помощью RewriteRule

Веб-приложения часто используютquery strings, которые добавляются к URL-адресу с помощью вопросительного знака (?) после адреса. Отдельные параметры разделяются амперсандом (&). Строки запроса могут использоваться для передачи дополнительных данных между отдельными страницами приложения.

Например, страница результатов поиска, написанная на PHP, может использовать URL-адрес типаhttp://example.com/results.php?item=shirt&season=summer. В этом примере в воображаемый сценарий приложенияresult.php передаются два дополнительных параметра:item со значениемshirt иseason со значениемsummer. Приложение может использовать информацию строки запроса, чтобы построить правильную страницу для посетителя.

Правила перезаписи Apache часто используются для упрощения таких длинных и неприятных ссылок, как приведенные выше, вfriendly URLs, которые легче вводить и интерпретировать визуально. В этом примере мы хотели бы упростить указанную выше ссылку, чтобы она сталаhttp://example.com/shirt/summer. Значения параметровshirt иsummer все еще находятся в адресе, но без строки запроса и имени сценария.

Вот одно правило для реализации этого:

Простая замена

RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]

shirt/summer явно соответствует запрошенному адресу, и Apache вместо этого получает указание обслуживатьresults.php?item=shirt&season=summer.

Флаги[QSA] обычно используются в правилах перезаписи. Они говорят Apache добавить любую дополнительную строку запроса к обслуживаемому URL-адресу, поэтому, если посетитель вводитhttp://example.com/shirt/summer?page=2, сервер ответитresults.php?item=shirt&season=summer&page=2. Без этого дополнительная строка запроса будет отброшена.

В то время как этот метод достигает желаемого эффекта, и название предмета, и сезон жестко закодированы в правиле. Это означает, что правило не будет работать ни для каких других элементов, напримерpants, или сезонов, напримерwinter.

Чтобы сделать правило более общим, мы можем использоватьregular expressions для сопоставления частей исходного адреса и использования этих частей в шаблоне подстановки. Измененное правило будет выглядеть следующим образом:

Простая замена

RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]

Первая группа регулярных выражений в скобках соответствует строке, содержащей буквенно-цифровые символы и числа, напримерshirt илиpants, и сохраняет совпавший фрагмент как переменную$1. Вторая группа регулярного повторного выражения в скобках точно соответствуетsummer,winter,fall илиspring и аналогичным образом сохраняет совпавший фрагмент как$2.

Соответствующие фрагменты затем используются в результирующем URL в переменныхitem иseason вместо жестко запрограммированных значенийshirt иsummer, которые мы использовали ранее.

Вышеупомянутое преобразует, например,http://example.com/pants/summer вhttp://example.com/results.php?item=pants&season=summer. Этот пример также является перспективным, позволяя корректно переписать несколько элементов и сезонов, используя одно правило.

[[пример-2 -—- добавление-условий-с-логикой-using-rewriteconds]] == Пример 2 - Добавление условий с логикой с использованием RewriteConds

Правила перезаписи не обязательно всегда оцениваются по одному без каких-либо ограничений. ДирективаRewriteCond позволяет нам добавлять условия к нашим правилам перезаписи, чтобы контролировать, когда правила будут обрабатываться. ВсеRewriteCondsпридерживаются следующего формата:

Общая структура RewriteCond

RewriteCond TestString Condition [Flags]
  • RewriteCond указывает директивуRewriteCond.

  • TestString - это строка для проверки.

  • Condition - шаблон или условие для сопоставления.

  • Flags - это необязательные параметры, которые могут изменять условия и правила оценки.

ЕслиRewriteCond истинно, будет учитываться следующий заRewriteRule. Если этого не произойдет, правило будет отменено. НесколькоRewriteCond могут использоваться один за другим, и при поведении по умолчанию все они должны быть истинными, чтобы следующее правило было рассмотрено.

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

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

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

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

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

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

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

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

Заключение

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

Если вы хотите узнать больше оmod_rewrite, взгляните наApache’s mod_rewrite Introduction иApache’s official documentation for mod_rewrite.

Related