Как настроить mod_rewrite для Apache в Ubuntu 14.04

Вступление

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

Это руководство разделено на две половины: первая устанавливает образец веб-приложения, а вторая объясняет часто используемые правила перезаписи.

Предпосылки

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

Шаг 1 - Установка Apache

На этом этапе мы будем использовать встроенный установщик пакетов, называемый + apt-get. Это значительно упрощает управление и облегчает чистую установку.

Сначала обновите индекс пакета системы. Это гарантирует, что старые или устаревшие пакеты не будут мешать установке.

sudo apt-get update

Apache2 - это вышеупомянутый HTTP-сервер, который наиболее часто используется в мире. Чтобы установить его, запустите следующее:

sudo apt-get install apache2

Информацию о различиях между Nginx и Apache2, двумя наиболее популярными веб-серверами с открытым исходным кодом, см. В thsive.

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

Теперь нам нужно активировать + mod_rewrite +.

sudo a2enmod rewrite

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

sudo service apache2 restart

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

В этом разделе мы настроим файл + .htaccess + для более простого управления правилами перезаписи.

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

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

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

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

Внутри этого файла вы найдете блок + <VirtualHost *: 80> + в строке 1. Внутри этого блока добавьте следующий блок:

/etc/apache2/sites-available/default<Directory /var/www/html>
               Options Indexes FollowSymLinks MultiViews
               AllowOverride All
               Order allow,deny
               allow from all
</Directory>

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

/etc/apache2/sites-available/default<VirtualHost *:80>
   <Directory /var/www/html>

       . . .

   </Directory>

   . . .
</VirtualHost>

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

sudo service apache2 restart

Теперь создайте файл + .htaccess.

sudo nano /var/www/html/.htaccess

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

/var/www/html/.htaccessRewriteEngine on

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

Чтобы гарантировать, что другие пользователи могут только read ваш + .htaccess +, выполните следующую команду, чтобы обновить разрешения.

sudo chmod 644 /var/www/html/.htaccess

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

Шаг 4 - Настройка файлов

В этом разделе мы настроим базовую перезапись URL, которая преобразует красивые URL в реальные пути к коду. В частности, мы дадим пользователям доступ к + / 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>

Вы можете получить доступ к своему веб-приложению по адресу + / about.html или` + / about.html`. Теперь обратите внимание, что доступен только + about.html; если вы попытаетесь получить доступ к + / about, вы получите ошибку * Not Found *. Мы бы хотели, чтобы пользователи обращались к + about +. Наши правила переписывания позволят эту функциональность.

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

sudo nano /var/www/html/.htaccess

После первой строки добавьте следующее.

/var/www/html/.htaccessRewriteRule ^about$ about.html [NC]

Ваш файл должен быть идентичен следующему.

/var/www/html/.htaccessRewriteEngine on
RewriteRule ^about$ about.html [NC]

Поздравляю. Теперь вы можете получить доступ к + / about + в вашем браузере!

Это хороший простой пример, демонстрирующий общий синтаксис, которому следуют все правила перезаписи.

+ ^ about $ + - это строка, которая соответствует URL. Это то, что зритель печатает в своем браузере. В нашем примере используется несколько metacharacters.

  • + ^ + указывает начало URL, после того как + / + удалено.

  • + $ + указывает на конец URL

  • + about + соответствует строке “about”

+ about.html + - это фактический путь, к которому обращается пользователь; то есть Apache все равно будет обслуживать файл + about.html +.

+ [NC] + - это flag, который игнорирует заглавные буквы в URL.

С помощью приведенного выше правила следующие URL будут указывать на + about.html:

  • '+ / Около + `

  • + / О +

  • + / About.html

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

  • '+ / О / + `

  • '+ / Контакт + `

Общие паттерны

В этом разделе мы покажем некоторые часто используемые директивы.

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

Вы можете настроить файлы примеров по путям результата, если хотите, но это руководство не включает создание файлов HTML и PHP; только правила переписывания.

Пример 1. Упрощение строк запроса с помощью RewriteRule

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

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

  • * pattern *: регулярное выражение, которое соответствует желаемой строке

  • * замена *: путь к фактическому URL

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

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

http://example.com/results.php?item=shirt&season=summer

В этом примере мы хотели бы упростить это, чтобы стать:

http://example.com/shirt/summer
  • Пример 1А: Простая замена *

Используя правило перезаписи, мы могли бы использовать следующее:

/var/www/html/.htaccessRewriteRule ^shirt/summer$ results.php?item=shirt&season=summer

Вышесказанное довольно очевидно, так как фактически отображает + shirt / summer + в + results.php? Item = shirt & season = summer +. Это достигает желаемого эффекта.

  • Пример 1B: Соответствующие параметры *

Тем не менее, мы хотели бы обобщить это, чтобы включить все сезоны. Итак, мы сделаем следующее:

  • Укажите ряд параметров, используя + | + логическое значение, означающее «ИЛИ»

  • Сгруппируйте совпадение, используя + () +, затем укажите ссылку на группу, используя + $ 1 +, с + 1 + для первой сопоставленной группы.

Правило переписывания теперь становится:

/var/www/html/.htaccessRewriteRule ^shirt/(summer|winter|fall|spring) results.php?item=shirt&season=$1

Показанное выше правило соответствует URL-адресу + shirt / +, за которым следует указанное время года. Этот сезон группируется с помощью + () +, а затем указывается с помощью + $ 1 + в следующем пути. Это означает, что, например, что:

http://example.com/shirt/winter

будет выглядеть так:

http://example.com/results.php?item=shirt&season=winter

Это также достигает желаемого эффекта.

  • Пример 1С: Соответствие наборам символов *

Однако мы также хотели бы указать любой тип элемента, а не только URL-адреса в + / shirt +. Итак, мы сделаем следующее:

  • Напишите regular expression, который соответствует всем буквенно-цифровым символам. Скобочное выражение + [] + соответствует любому символу внутри него, а + соответствует любому количеству символов, указанных в скобках

  • Сгруппируйте совпадение и укажите его как + $ 2 + в качестве второй переменной в файле.

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

Выше будет конвертировать, например:

http://example.com/pants/summer

to:

http://example.com/results.php?item=pants&season=summer
  • Пример 1D: передача строк запроса *

В этом разделе не вводятся какие-либо новые концепции, но рассматривается проблема, которая может возникнуть. Используя приведенный выше пример, допустим, что мы хотим перенаправить + http: // example.com / брюк / лето +, но передадим дополнительную строку запроса +? Page = 2 +. Мы хотели бы следующее:

http://example.com/pants/summer?page=2

для сопоставления с:

http://example.com/results.php?item=pants&season=summer&page=2

Если вы попытаетесь получить доступ к указанному выше URL с нашими текущими настройками, вы обнаружите, что строка запроса + page = 2 + потерялась. Это легко исправить с помощью дополнительного флага + QSA +. Измените правило перезаписи, чтобы соответствовать следующему, и желаемое поведение будет достигнуто.

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

Пример 2. Добавление условий с помощью логики

+ RewriteCond + позволяет нам добавлять условия в наши правила перезаписи. Все + RewriteCond + соблюдают следующий формат:

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

  • * TestString *: строка для проверки

  • * Условие *: шаблон для соответствия

  • * Флаги *: необязательные параметры, которые могут изменить условие

Если + RewriteCond + имеет значение true, будет рассматриваться + RewriteRule +, следующий сразу за ним.

  • Пример 2А: Страница по умолчанию *

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

/var/www/html/.htaccessRewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home

Это перенаправит что-то вроде + / admin / blargh + в + / admin / home +.

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

  • +% {REQUEST_FILENAME} + - строка для проверки

  • +! - f + использует оператор +! + not в имени файла

  • + RewriteRule перенаправляет все запросы обратно в` + / admin / home + `

Обратите внимание, что более синтаксически и технически правильный подход будет определять 404 + ErrorDocument +.

/var/www/html/.htaccessErrorDocument 404 /error.html
  • Пример 2B: ограничение доступа IP *

Хотя это также может быть достигнуто с помощью других методов, можно использовать + RewriteCond +, чтобы ограничить доступ к одному IP или совокупности IP-адресов.

Этот пример блокирует трафик отовсюду *, за исключением * 12.34.56.789.

/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

Этот пример является просто отрицанием Example 3 из старой статьи mod_rewrite. Весь оператор гласит: «если адрес не 12.34.56.789, не разрешать доступ».

Короче:

  • +% {REMOTE_ADDR} + - строка адреса

  • +! ^ (12 \ .34 \ .56 \ .789) $ + экранирует все периоды +. + С обратной косой чертой + \ + и отменяет IP-адрес с помощью +! +

  • Флаг + F + запрещает доступ, а флаг + L + указывает, что это последнее правило, которое нужно запустить, если оно выполнено

Если вы предпочитаете * block * 12.34.56.789, используйте вместо этого:

/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

Вы можете найти другие правила переписывания и способы предотвращения горячих ссылок в оригинальной статье part 1 и https: // www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite-page-2[part 2].

Заключение

+ mod_rewrite + может эффективно использоваться для обеспечения удобочитаемых URL-адресов. Однако сам файл «+ .htaccess +» имеет гораздо больше применений, чем просто этот модуль, и следует отметить, что многие другие модули Apache могут быть установлены для расширения его функциональности.

Существуют и другие ресурсы, подробно описывающие возможности + mod_rewrite +:

+ mod_rewrite + является критически важным модулем для безопасности веб-приложений, но иногда может привести к возникновению циклов перенаправления или вездесущим, неоднозначным ошибкам 500 запретных +. Советы по отладке ` .htaccess +` см. По адресу th это сообщение StackOverflow.

Правила переписывания пишутся с помощью регулярных выражений. Чтобы стать экспертом, обратитесь к этому tutorial все о регулярных выражениях.

Для быстрого анализа ваших шаблонов регулярных выражений, вот online отладчик, который может обеспечить немедленную обратную связь и интерпретации ваших шаблонов регулярных выражений в реальном времени.

Related