Вступление
В этом уроке мы активируем и научимся управлять перезаписью URL с помощью модуля Apache2 + mod_rewrite +
. Этот инструмент позволяет нам переписывать URL-адреса более понятным образом, переводя удобочитаемые пути в удобные для кода строки запросов.
Это руководство разделено на две половины: первая устанавливает образец веб-приложения, а вторая объясняет часто используемые правила перезаписи.
Предпосылки
Чтобы следовать этому уроку, вам понадобится:
-
Одна свежая капля Ubuntu 14.04
-
Пользователь без полномочий root, который вы можете настроить, выполнив шаги 2 и 3 https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-ubuntu -14-04-vps [этот урок]
Шаг 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 отладчик, который может обеспечить немедленную обратную связь и интерпретации ваших шаблонов регулярных выражений в реальном времени.