Как переписывать 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 имеет решающее значение для безопасности вашего веб — приложения. Период, который предшествует имени файла гарантирует, что файл скрыт.

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

Тем не менее, в этом простом примере, увеличение производительности будет незначительным. Кроме того, устанавливая правила .htaccess удобно, особенно с нескольких веб — сайтами на одном сервере. Она не требует перезагрузки сервера, чтобы изменения вступили в силу , и это не требует привилегий суперпользователя для редактирования этих правил, что упрощает техническое обслуживание и внесение изменений и возможные с непривилегированных аккаунтов. Некоторые популярные программы с открытым исходным кодом, такие как 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

<VirtualHost *:80>

    <Directory /var/www/html>

        Options Indexes FollowSymLinks MultiViews

        AllowOverride All

        Require all granted

    </Directory>



    . . .

</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://your_server_ip/about

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

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

 

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

/var/www/html/about.html

<html>

    <head>

        <title>О нас</title>

    </head>

    <body>

        <h1>О нас</h1>

    </body>

</html>

 

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

RewriteRules соблюдает следующий формат:

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

RewriteRule pattern substitution [flags]


  • RewriteRule определяет директиву.
  • pattern является регулярное выражение, которое соответствует желаемой строки из 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».
  • 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 с простым правилом, вы можете изменить и расширить для ваших потребностей. В следующих разделах мы покажем два дополнительных примера наиболее часто используемых директив.

Пример 1 — Упрощение строки запросов с RewriteRule

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

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

Правила перезаписи Apache часто используются для упрощения таких длинных и неприглядных ссылок как выше в дружественные URL — адреса, которые легче вводить и интерпретировать визуально. В этом примере, мы хотели бы, упростить ссылку выше, чтобы сделать http://example.ru/shirt/andreyex. shirt и значения параметров author и andreyex к прежнему адресу, но без строки запроса и имени сценария.

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

Простой пример

RewriteRule ^shirt/andreyex$ results.php?item=shirt&author=andreyex [QSA]

 

shirt/andreyex явно сопоставляются в запрашиваемом адресе и Apache указал запустить вместо этого results.php?item=shirt&author=andreyex.

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

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

Для того, чтобы сделать правило более общо, мы можем использовать регулярные выражения, чтобы соответствовать части исходного адреса и использовать те части в схеме замещения. Модифицированное правило будет выглядеть следующим образом :

Простой пример

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

 

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

Согласованные фрагменты затем в результирующий URL в переменные item и author вместо жёстко shirt и andreyex, которые мы использовали раньше.

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

Пример 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, посмотрите на введение в mod_rewrite Apache и официальной документации Apache для mod_rewrite.

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



2017-01-30T20:35:43
Настройка Debian