Hackware.ru

Содержание

Step 3 — Configuring URL Rewrites

Here, we will set up a basic URL rewrite which converts pretty URLs into actual paths to pages. Specifically, we will allow users to access , and display a page called .


Begin by creating a file named in the web root:

Copy the following HTML code into the file, then save and close it.

/var/www/html/about.html

You can access this page at , but notice that if you try to access , you will see a 404 Not Found error. To access the page using instead, we’ll create a rewrite rule.

All follow this format:

General RewriteRule structure

  • specifies the directive.
  • is a regular expression that matches the desired string from the URL, which is what the viewer types in the browser.
  • is the path to the actual URL, i.e. the path of the file Apache serves.
  • are optional parameters that can modify how the rule works.

Let’s create our URL rewrite rule. Open up the file:

After the first line, add the following and save the file:

/var/www/html/.htaccess

In this case, is the pattern, is the substitution, and is a flag. Our example uses a few characters with special meaning:

  • indicates the start of the URL, after .
  • indicates the end of the URL.
  • matches the string “about”.
  • is the actual file that the user accesses.
  • is a flag that makes the rule case insensitive.

You can now access in your browser. In fact, with the rule shown above, the following URLs will also point to :

  • , because of the rule definition.
  • , because the rule is case insensitive.
  • , because the original filename will always work.

However, the following will not work:

  • , because the rule explicitly states that there may be nothing after , since the character appears after .
  • , because it won’t match the string in the rule.

You now have an operational file with a basic rule that you can modify and extend to your needs. In the following sections, we will show two additional examples of commonly used directives.

Общие шаблоны

Итак, теперь вы знаете основы написания правил перезаписи. Рассмотрим два дополнительных примера.

Примечание: Для тестирования можно создать пару дополнительных файлов.

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

Приложения часто используют строки запросов. Эти строки находятся в URL-адресе, начиная с вопросительного знака (?) и заканчивая амперсандом (&). Обрабатывая правила перезаписи, Apache игнорирует эти два символа. К примеру, URL страницы результатов поиска, написанной на PHP, может выглядеть следующим образом:

Конечно, пользователям будет гораздо удобнее, если ссылка будет чистой:

Этого можно добиться двумя способами: с помощью простой замены или группирования параметров.

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

Создайте правило, выполняющее простую замену, чтобы ссылка стала чистой:

Это правило вместо results.php?item=shoes&type=women будет использовать shoes/women.

2: Сопоставление и группирование

В некоторых ситуациях нужно оптимизировать строку запросов (к примеру, чтобы она включала несколько видов обуви). Для этого нужно:

  • Задать набор параметров, разделив их с помощью символа вертикальной черты | (логический оператор OR).
  • Сгруппировать все заданные параметры с помощью круглых скобок (), а затем сослаться на группу с помощью переменной $1 (где 1 – номер группы параметров).

В результате получится такое правило:

Это правило добавляет в URL новый сегмент.

3: Совпадение наборов символов

Чтобы пользователь мог открыть чистый URL любого раздела сайта (не только /shoes), нужно:

  • Написать регулярное выражение, совпадающее со всеми алфавитно-цифровыми символами. В квадратных скобках указывается поисковой шаблон (в данном случае он включает все символы), а символ + указывет что каждый символ в шаблоне может повторяться неограниченное количество раз.
  • Сгруппировать этот набор символов и присвоить ему $2.

Это правило преобразует:

в:

4: Дополнительная строка запроса

Это позволит вам устранить ряд потенциальных проблем. Попробуйте преобразовать:

в:

При текущих настройках вы не сможете перейти на page=2. Это можно исправить с помощью флага QSA, который позволяет комбинировать строки запросов. Отредактируйте правило следующим образом:

Пример 2: Условия RewriteCond

Теперь рассмотрим подробнее директиву RewriteCond. Если условие перезаписи истинно, Apache обработает следующее за ним правило RewriteRule.

1: Страница по умолчанию

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

Теперь все ссылки на несуществующие страницы будут перенаправлены на /admin/home.

Рассмотрим вышеприведённое правило по частям:

  • %{REQUEST_FILENAME} проверяет запрашиваемую строку.
  • !-f: оператор ! (not) указывает, что если запрашиваемого файла не существует, веб-сервер должен выполнить следующее правило переадресации.
  • RewriteRule перенаправляет запрос на /admin/home.

Также можно задать ErrorDocument, на который будут отправляться все запросы на несуществующие страницы. Создайте правило ErrorDocument и перенаправьте все ошибки 404 на страницу error.html:


Теперь все запросы, которые получили ошибку 404, будут переадресованы на error.html.

2: Ограничение доступа по IP

RewriteCond позволяет ограничивать доступ к сайту по IP-адресу.

К примеру, это правило заблокирует весь трафик, кроме 198.51.100.24:

Если сайт будет запрашиваться другими IP-адресами, трафик будет заблокирован.

Вкратце рассмотрим это правило:

  • %{REMOTE_ADDR} – строка адреса.
  • !^(198\.51\.100\.24)$ — IP-адрес. Обратный слеш позволяет обойти метасимвол «.».

Чтобы заблокировать доступ к сайту для определенного IP, используйте такое правило:

Существует множество способов управления доступом к сайту, и файл .htaccess – один из самых простых.

Step 2 — Setting Up .htaccess

An file allows us to modify our rewrite rules without accessing server configuration files. For this reason, is critical to your web application’s security. The period that precedes the filename ensures that the file is hidden.

Note: Any rules that you can put in an file can be also put directly into server configuration files. In fact, the official Apache documentation recommends using server configuration files instead of because Apache processes it faster that way.

However, in this simple example, the performance increase will be negligible. Additionally, setting rules in is convenient, especially with multiple websites on the same server. It does not require a server restart for changes to take effect and it does not require root privileges to edit those rules, simplifying maintenance and and making changes possible with unprivileged account. Some popular open-source software, like WordPress and Joomla, often relies on an file for the software to modify and create additional rules on demand.

We will need to set up and secure a few more settings before we can begin.

By default, Apache prohibits using an file to apply rewrite rules, so first you need to allow changes to the file. Open the default Apache configuration file using or your favorite text editor.

Inside that file, you will find a block starting on the first line. Inside of that block, add the following new block so your configuration file looks like the following. Make sure that all blocks are properly indented.

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

Save and close the file. To put these changes into effect, restart Apache.

Now, create the file in the web root.

Add this line at the top of the new file to activate the rewrite engine.

/var/www/html/.htaccess

Save the file and exit.

You now have an operational file which you can use to govern your web application’s routing rules. In the next step, we will create sample website files that we’ll use to demonstrate rewrite rules.

4: Настройка перезаписи

Данный раздел покажет, как настроить базовую перезапись URL-адресов. В качестве примера используется ссылка example.com/about.

Создайте файл about.html:

Скопируйте следующий код и поместите его в файл:

Обратите внимание: доступ можно получить только к about.html. Если вы введёте ссылку ip_адрес_сервера /about, вы получите ошибку 404 Not Found

Создайте правило перезаписи, чтобы исправить это.

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

Добавьте в него следующую строку:

Теперь файл содержит такие настройки:

Теперь браузер сможет обслуживать страницу example.com/about.

На примере этого правила можно рассмотреть общий синтаксис перезаписи.

  • ^about$ — шаблон, с которым совпадает URL, и который пользователи вводят в браузере. В данном примере используются метасимволы, благодаря которым можно чётко обозначить местонахождение шаблона: символ ^ определяет начало шаблона, а • $ — конец.
  • about.html: исходный путь к странице, по которому обслуживается файл about.html.
  • : флаг, который отключает чувствительность URL-адреса к регистру.

Согласно этому правилу, доступ к странице можно получить по следующим ссылкам:

А такие ссылки не сработают:

Related

  • Tutorial

    The Apache HTTP server is the most widely-used web server in the world. It provides with many powerful features including dynamically loadable modules, robust media support, and extensive integration with other popular software. In this guide, we’ll discuss how to install…

  • Tutorial
    How To Set Up Password Authentication with Apache on Ubuntu 16.04

    When running a website, there are often parts of the site that you’ll want to restrict from visitors. Web applications may provide their own authentication and authorization methods, but the web server itself can also be used to restrict access if these are inadequate or unavailable.

    In this guide, we’ll demonstrate how to password-protect assets on an Apache web server running on Ubuntu 16.04.

  • Tutorial

    There are three main commands, and a set of common log locations that you can use to get started troubleshooting Apache errors. Generally when you are troubleshooting Apache, you will use these commands in the order indicated here, and then examine log files for specific…

  • Tutorial
    Apache Configuration Error AH00526: Syntax error

    This error is encountered when the there is a typo or mis-configured setting in your Apache configuration files. It is a generic error that can be indicative of a number of underlying problems.

    The error can be detected using `apachectl configtest` before an invalid configuration is loaded. It can also be found using the `systemctl` and `journalctl` commands. In the latter two cases, Apache will be unable to run because of the error.

Пример 1: переход на другой домен

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

В таком случае нужно настроить редирект со старого домена (например, domain1.com) на новый (domain2.com). Чтобы навсегда сменить доменное имя сайта, используйте постоянный редирект. Благодаря этому браузер сможет перенаправлять поступающий трафик на новый домен.

Итак, предположим, что на данный момент сайт обслуживается по домену domain1.com, а его виртуальный хост находится в /etc/apache2/sites-available/domain1.com.conf:

Виртуальный хост для нового домена сайта, /etc/apache2/sites-available/domain2.com.conf, должен выглядеть так:

Теперь измените настройки виртуального хоста domain1.com и добавьте в них постоянный редирект на domain2.com:

В данном случае используется директива RedirectMatch, а не Redirect, поскольку сайт состоит из нескольких страниц. Регулярное выражение ^/(.*)$ совпадает с любым текстом, идущим в URL-адресе после /. Таким образом, http://domain1.com/index.html будет перенаправляться на http://domain2.com/index.html.

Чтобы настроить постоянный редирект, нужно просто добавить опцию permanent в директиву RedirectMatch.

Примечание: После изменения виртуального хоста нужно перезапустить Apache, чтобы обновить настройки:

Регулярные выражения mod_rewrite

mod_rewrite использует Perl Compatible Regular Expression (PCRE — Perl совместимые регулярные выражения). В этой статье, мы не будем подробно описывать использование регулярных выражений имхо этой теме посвящены целые тома книг и в одной статье нельзя охватить данную тематику.

Для большего понимания механизмов PCRE рекомендую запастись какой-то книгой, например «Книга Джеффри Фридла «Регулярные выражения»«, или как минимум ознакомьтесь с материалами по ссылкам:

Главное, что нужно помнить, — это то, что в регулярных выражениях используются специальные символы (метасимволы) и обычные символы (литералы). Основными метасимволами являются . Метасимволы всегда нужно экранировать обратным слэшем «\», — это относится к пробелу («\ «), а также тому же обратному слэшу («\\»).

Нужно помнить, что mod_rewrite использует оригинальный PCRE (Perl совместимые регулярные выражения), но с некоторыми дополнениями:

  • ‘!Условие’ (несоответствие условию)
  • ‘<Условие’ (лексически меньше условия)
  • ‘>Условие’ (лексически больше условия)
  • ‘=Условие’ (лексически равно условию)
  • ‘-d’ (является ли каталогом)
  • ‘-f’ (является ли обычным файлом)
  • ‘-s’ (является ли обычным файлом с ненулевым размером)
  • ‘-l’ (является ли символической ссылкой)
  • ‘-F’ (проверка существования файла через подзапрос)
  • ‘-U’ (проверка существования URL через подзапрос)

Переменные mod_rewrite

В условиях (RewriteCond) и в правилах (RewriteRule) можно использовать переменные сервера.

1. HTTP headers (RqH — Request Header):

  • HTTP_USER_AGENT — содержит полную строку заголовка «User-Agent:»;
  • HTTP_REFERER — адрес с которого пришел пользователь;
  • HTTP_COOKIE — доступ к списку COOKIE браузера;
  • HTTP_FORWARDED — содержит IP-адрес прокси-сервера или сервера балансировки нагрузки;
  • HTTP_HOST — адрес хоста/сервера, который запросил пользователь, например, example.com;
  • HTTP_PROXY_CONNECTION — содержит лексему соединения (connection-token) «close» или «Keep-Alive», предназначен для согласования постоянных соединений между клиентом и сервером (аналог заголовка Connection);
  • HTTP_ACCEPT — заголовок согласования содержимого, которое поддерживает браузер/клиент пользователя, например «» («тип/подтип», через запятую, где тип – это тип содержимого, а подтип – это уточнение типа.). Если заголовок Accept содержит «» (*/*), то это означает, что клиент готов принять содержимое любого типа.

2. connection & request (соединение & запрос):

  • REMOTE_ADDR — IP-адрес клиента;
  • REMOTE_HOST — ДНС-имя IP-адреса клиента;
  • REMOTE_PORT — номер текущего порта клиента;
  • REMOTE_USER — содержит имя авторизированного (средствами сервера) пользователя;
  • REMOTE_IDENT — переменная будет установлена только если подключен модуль mod_ident и IdentityCheck установлено в «on», предназначена для работы с Ident протоколом https://ru.wikipedia.org/wiki/Ident;
  • REQUEST_METHOD — метод, которым был сделан запрос, GET|GET|HEAD и т.д.;
  • SCRIPT_FILENAME — полный путь к запрошенному файлу, например /var/www/public_html/script_name.php;
  • PATH_INFO — Содержит предоставленный пользователем путь, который содержится после имени скрипта, но до строки запроса (?). Например, если скрипт был запрошен по URL http://www.example.com/php/path_info.php/some/stuff?foo=bar, то переменная $_SERVER будет содержать /some/stuff.
  • QUERY_STRING — строка GET запроса, если запрошен адрес http://example.com/index.php?var=1&var=2, то QUERY_STRING будет содержать var=1&var=2;AUTH_TYPE — тип аутентификации, если выполнена HTTP-аутентификация, может быть Basic или Digest.

3. server internals (внутренние сервера):

  • DOCUMENT_ROOT — полный путь к домашнему каталогу пользователя, например /var/www/public_html/
  • SERVER_ADMIN — данные администратора сервера/виртуального_хоста, обычно адрес электронной почты;
  • SERVER_NAME — имя сервера, обычно из директивы ServerName;
  • SERVER_ADDR — IP-адрес сервера;
  • SERVER_PORT — порт сервера;
  • SERVER_PROTOCOL — версия используемого протокола, например HTTP/1.0 или HTTP/1.1;
  • SERVER_SOFTWARE — название/версия сервера.

4. date and time (системные, дата и время):

  • TIME_YEAR — год, 2014
  • TIME_MON — месяц, 05
  • TIME_DAY — день, 07
  • TIME_HOUR — час, 04 (24)
  • TIME_MIN — минуты, 38
  • TIME_SEC — секунды, 55
  • TIME_WDAY — день недели, 3 (среда)
  • TIME — в формате год-мес-день-час-мин-сек, например 20140514234534

5. specials (специальные):

  • API_VERSION — в формате «20051115:33»
  • THE_REQUEST — подробности GET/POST запроса, например «GET /index.html HTTP/1.1»
  • REQUEST_URI — относительный УРЛ запроса «/index.html»
  • REQUEST_FILENAME — полный локальный путь к файлу или скрипту в файловой системе, соответствующего запроса
  • IS_SUBREQ — если выполняется подзапрос, то переменная содержит true, в противном случае false
  • HTTPS — on/off, если используется/неиспользуется HTTPS

6. переменные результата выполнения:

  • $1 — $1, $2 и т.д. образуются при совпадении (шаблона1.*) (шаблона2.*) из RewriteRule
  • %1 — %1, %2 и т.д. образуются при совпадении (шаблона1.*) (шаблона2.*) из RewriteCond

Дополнительные ссылки по HTTP заголовкам и переменным сервера:

Шаг 3 – Настройка перезаписи URL

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

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

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 вместо того, чтобы, переписать правила позволит эта самая функциональность

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

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

  • определяет директиву.
  • является регулярное выражение, которое соответствует желаемой строки из URL, типы просмотра в браузере.
  • это путь к реальному URL, то есть путь файловых серверов Apache.
  • необязательные параметры, которые можно изменять, как работает правило.

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

sudo nano /var/www/html/.htaccess

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

/var/www/html/.htaccess

RewriteEngine on
RewriteRule ^about$ about.html 

В этом случае, это шаблон, это замена, и является флагом. Наш пример использует несколько символов со специальным значением:

  • указывает на начало URL, после .
  • указывает на конец URL.
  • соответствует строке “about”.
  • является фактическим файл, который обращается к пользователю.
  • является флагом, который делает случай правила нечувствительным.

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

  • , из-за определения правила.
  • , Так как правило не чувствительно к регистру.
  • , так как оригинальное собственное имя файла всегда будет работать.

Ниже не будет:

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

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

Общие шаблоны

Итак, теперь вы знаете основы написания правил перезаписи. Рассмотрим два дополнительных примера.

Примечание: Для тестирования можно создать пару дополнительных файлов.

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

Правила RewriteRule имеют такой формат:

Где:

  • RewriteRule: директива.
  • pattern: регулярное выражение, которое задаёт шаблон поиска строки.
  • substitution: целевой URL-адрес
  • flags: опциональные параметры, которые изменяют поведение правила.

Приложения часто используют строки запросов. Эти строки находятся в URL-адресе, начиная с вопросительного знака (?) и заканчивая амперсандом (&). Обрабатывая правила перезаписи, Apache игнорирует эти два символа. К примеру, URL страницы результатов поиска, написанной на PHP, может выглядеть следующим образом:

Конечно, пользователям будет гораздо удобнее, если ссылка будет чистой:

Этого можно добиться двумя способами: с помощью простой замены или группирования параметров.

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

Создайте правило, выполняющее простую замену, чтобы ссылка стала чистой:

Это правило вместо results.php?item=shirt&season=summer будет использовать shirt/summer.

2: Сопоставление и группирование

В некоторых ситуациях нужно оптимизировать строку запросов (к примеру, чтобы она включала все сезоны). Для этого нужно:

  • Задать набор параметров, разделив их с помощью символа вертикальной черты | (логический оператор OR).
  • Сгруппировать все заданные параметры с помощью круглых скобок (), а затем сослаться на группу с помощью переменной $1 (где 1 – номер группы параметров).

В результате получится такое правило:

Это правило добавляет в URL новый сегмент.

3: Совпадение наборов символов

Чтобы пользователь мог открыть чистый URL любого раздела сайта (не только / shirt), нужно:

  • Написать регулярное выражение, совпадающее со всеми алфавитно-цифровыми символами. В квадратных скобках указывается поисковой шаблон (в данном случае он включает все символы), а символ + указывет что каждый символ в шаблоне может повторяться неограниченное количество раз.
  • Сгруппировать этот набор символов и присвоить ему $2.

Это правило перепишет ссылку:

в:

4: Дополнительная строка запроса

Это позволит вам устранить ряд потенциальных проблем. Попробуйте преобразовать:

в:

При текущих настройках вы не сможете перейти на page=2. Это можно исправить с помощью флага QSA, который позволяет комбинировать строки запросов. Отредактируйте правило следующим образом:

Пример 2: Условия RewriteCond

Теперь рассмотрим подробнее директиву RewriteCond. RewriteCond имеет такой формат:

  • RewriteCond: директива.
  • TestString: строка для сравнения.
  • Condition: шаблон, с которым нужно сравнить строку.
  • Flags: дополнительные параметры.

Если условие перезаписи RewriteCond истинно, Apache обработает следующее за ним правило RewriteRule.

 1: Страница по умолчанию

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

Теперь все ссылки на несуществующие страницы будут перенаправлены на /admin/home.

Рассмотрим вышеприведённое правило по частям:

  • %{REQUEST_FILENAME} проверяет запрашиваемую строку.
  • !-f: оператор ! (not) указывает, что если запрашиваемого файла не существует, веб-сервер должен выполнить следующее правило переадресации.
  • RewriteRule перенаправляет запрос на /admin/home.

Также можно задать ErrorDocument, на который будут отправляться все запросы на несуществующие страницы. Создайте правило ErrorDocument и перенаправьте все ошибки 404 на страницу error.html:

2: Ограничение доступа по IP

RewriteCond позволяет ограничивать доступ к сайту по IP-адресу.

К примеру, это правило заблокирует весь трафик, кроме 12.34.56.789:

Если сайт будет запрашиваться другими IP-адресами, трафик будет заблокирован.

Вкратце рассмотрим это правило:

  • %{REMOTE_ADDR} – строка адреса.
  • !^(12\.34\.56\.789)$ — IP-адрес. Обратный слеш позволяет обойти метасимвол «.».
  • Флаг F запрещает доступ, а L означает, что это правило должно выполняться последним.

Чтобы заблокировать доступ к сайту для определенного IP, используйте такое правило:

Существует множество способов управления доступом к сайту, и файл .htaccess – один из самых простых.


С этим читают