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