Блог / Статьи

Полезная информация для вашего хостинга

Как настроить Apache через `.htaccess`

Как настроить Apache через `.htaccess`

Apache является наиболее распространённым HTTP-сервером. Он бесплатен и доступен вместе с исходным кодом. Поддерживает такие технологии, как CGI (включая FastCGI), PHP, Perl, и Java. Для аутентификации доступны базовые методы, message-digest, а также TLS (SSL). С апреля 1996 года Apache удерживает звание самого популярного сервера, а в августе 2007 года он обслуживал 51% всех веб-серверов в интернете.

Что такое .htaccess?

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

По сути, .htaccess выполняет роль локального аналога httpd.conf или apache2.conf. Его действие распространяется только на каталог, где он расположен, и на его подкаталоги. Этот файл можно разместить в любом каталоге сайта, а его директивы будут действовать до тех пор, пока не будут переопределены в подкаталогах.

Почему он называется .htaccess?

Название .htaccess расшифровывается как «hypertext access». Это служебный файл, который используется для настройки веб-сервера Apache и не является частью пользовательских файлов сайта.

Основные возможности .htaccess
Через этот файл можно задавать настройки сервера Apache. Например:
- Исправлять проблемы с кодировкой, чтобы текст на сайте не отображался в виде странных символов.
- Настраивать редиректы, перенаправляя пользователей с одного адреса на другой.
- Указывать страницы ошибок, чтобы пользователь видел понятное описание ошибки.
- Создавать удобные для восприятия URL, что улучшает SEO.
- Ограничивать доступ к сайту для поисковых ботов или отдельных IP-адресов.

.htaccess предоставляет обширный функционал, в том числе:
- Простое и сложное перенаправление (редирект).
- Настройку индексных страниц.
- Обработку ошибок.
- Управление кодировкой.
- Ограничение доступа и защиту директорий паролями.
- Указание опций PHP.
- Блокировку загрузки изображений с сайта.
- Предотвращение выполнения вредоносных скриптов.

Далее рассмотрим популярные директивы более подробно.

Простое перенаправление (редирект)

Это одна из самых востребованных возможностей .htaccess. Например, чтобы перенаправить всех посетителей сайта на другой URL, нужно создать файл .htaccess в корневом каталоге сайта со следующим содержимым: 

Redirect / http://www.example.com
# http://www.example.com — URL, на который перенаправляются запросы

Можно настроить редиректы для отдельных страниц: 

Redirect /linux http://www.linux.org
Redirect /linux/download.html http://www.linux.org/dist/download_info.html
Redirect 301 /kernel http://www.linux.org

Теперь при переходе на http://mysite.ru/linux пользователь будет перенаправлен на http://www.linux.org, а при переходе на http://mysite.ru/linux/download.html — на http://www.linux.org/dist/download_info.html. В последнем примере сервер возвращает код 301, указывающий на постоянное перемещение документа.

Синтаксис команды Redirect

Команда Redirect используется для перенаправления запросов на другой URL. Её синтаксис выглядит так: 

Redirect [status] URI_LOCAL URL_REDIRECT

- status *(необязательно)* — код возврата, который сообщает браузеру или поисковой системе причину перенаправления. Возможные значения:
- permanent (301) — документ перемещён на постоянной основе.
- temp (302) — документ временно перемещён.
- seeother (303) — "смотрите другой" документ.
- gone (410) — ресурс удалён.
- URI_LOCAL — локальная часть URL запрашиваемого документа.
- URL_REDIRECT — адрес, куда перенаправляется запрос.

Директива RedirectMatch

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

Пример: 

RedirectMatch /(.*)/(.*)/index.html$ http://mysite.ru/script.php?par1=$1&par2=$2

Этот пример показывает, как использовать регулярные выражения для передачи параметров в URL.

Основные элементы синтаксиса регулярных выражений:
- () — выделяют группы символов, к которым можно обратиться позже.
- ^ — указывает на начало строки.
- $ — указывает на конец строки.
- . — заменяет любой символ.
- | — логическое "или". Например, `A|B` означает "A или B".
- ? — обозначает, что символ (или группа) может присутствовать или отсутствовать.
- \* — символ (или группа) может отсутствовать или повторяться неограниченное число раз.
- + — символ (или группа) должен появиться хотя бы один раз, но может повторяться.
- [] — список допустимых символов. Например, `[a-z]` — любые строчные буквы.
- [^] — список недопустимых символов. Например, `[^0-9]` — любой символ, кроме цифр.
- \\ — экранирование специальных символов, чтобы использовать их как обычные.
- Всё, что идёт после символа #, считается комментарием.

Директивы сложного перенаправления (mod_rewrite)

Модуль mod_rewrite — это мощный инструмент для преобразования URL-адресов на сервере Apache. Он позволяет:
- Использовать гибкие правила перенаправления.
- Применять условия для выполнения перенаправлений.
- Задействовать регулярные выражения для более сложных сценариев.
- Интегрировать данные из различных источников (заголовки HTTP, переменные окружения, внешние базы данных и др.).

Как работает mod_rewrite:
1. RewriteCond задаёт условия, при которых выполняется правило.
2. RewriteRule — само правило преобразования, которое выполняется при соблюдении условий.

Пример директивы с условиями:

RewriteCond %{HTTP_USER_AGENT} ^Mozilla
RewriteRule ^/oldpage$ /newpage [R=301,L]

Этот пример проверяет, является ли браузер пользователя Mozilla. Если да, запросы на `/oldpage` перенаправляются на `/newpage` с кодом 301 (постоянное перенаправление). 

Обратная связь

В mod_rewrite можно использовать части URL (группы из регулярных выражений) для формирования новых URL или передачи параметров.
- $N — (0 ≤ N ≤ 9) обращение к группам из RewriteRule.
- %N — (1 ≤ N ≤ 9) обращение к группам из RewriteCond.

Доступные переменные mod_rewrite

Mod_rewrite предоставляет доступ к множеству переменных сервера и окружения, среди которых:
- HTTP_USER_AGENT — информация о браузере и ОС.
- HTTP_REFERER — URL страницы, откуда пришёл пользователь.
- REMOTE_ADDR — IP-адрес пользователя.
- REQUEST_METHOD — тип запроса (GET, POST).
- QUERY_STRING — строка запроса, переданная скрипту.
- REQUEST_URI — запрашиваемый ресурс.
- DOCUMENT_ROOT — путь к корневой директории сервера.
- SERVER_NAME — имя сервера.

Пример с использованием переменных:

RewriteCond %{HTTP_USER_AGENT} ^Googlebot
RewriteRule ^/private /error403.html [R=403,L]

Этот пример блокирует доступ к `/private` для поискового робота Google. 

Mod_rewrite — это мощный инструмент для реализации сложных сценариев управления URL, от простых редиректов до сложных трансформаций с учётом множества факторов. Условие – это шаблон условия, т. е. какое-либо регулярное выражение, применяемое к текущему экземпляру "Сравниваемая Строка", т.е. "Сравниваемая Строка" просматривается на поиск соответствия Условию.
Модуль mod_rewrite предоставляет широкий набор инструментов для гибкого управления запросами, основанный на регулярных выражениях и специальных флагах. Рассмотрим ключевые моменты использования.

Условия RewriteCond

Условия позволяют задавать дополнительные проверки перед применением правил. Каждое условие поддерживает:
- Проверку на соответствие регулярным выражениям.
Пример:

RewriteCond %{HTTP_USER_AGENT} ^Mozilla

- Префикс `!` для инверсии условия:

RewriteCond %{HTTP_USER_AGENT} !^Mozilla

- Лексические сравнения:
- `<Условие` — меньше.
- `>Условие` — больше.
- `=Условие` — равно. 

- Файловые и системные проверки:
- `-d` — является каталогом.
- `-f` — является обычным файлом.
- `-s` — файл существует и его размер ненулевой.
- `-l` — является символической ссылкой.
- `-F` — файл существует (проверка через подзапрос).
- `-U` — URL существует (проверка через подзапрос).

Для инверсии любого из этих проверок используется префикс `!`.

Пример:

RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteRule ^(.*)$ /error.html [L]

Этот код перенаправляет запросы на `/error.html`, если запрашиваемый ресурс не является файлом и не является каталогом. 

Управление механизмом RewriteEngine

Для включения или отключения преобразований используется команда: 

RewriteEngine on | off

Обратите внимание, что настройки RewriteEngine не наследуются, и её необходимо включать отдельно для каждого виртуального хоста. 

Примеры правил RewriteRule

1. Перенаправление поддоменов в отдельные каталоги:

RewriteEngine on
RewriteCond %{REMOTE_HOST} ^mysubdomain1.* [OR]
RewriteCond %{REMOTE_HOST} ^mysubdomain2.* [OR]
RewriteRule ^(.*)$ mysubdomain_public_html/$1

 2. Выдача разных главных страниц в зависимости от User-Agent:

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^$ /homepage.max.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^$ /homepage.min.html [L]
RewriteRule ^$ /homepage.std.html [L]

 3. Перенаправление в разные каталоги по User-Agent:

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^(.*)$ /mozilla/$1 [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^(.*)$ /lynx/$1 [L]
RewriteRule ^(.*)$ /default/$1 [L]

htaccess2

Флаги RewriteRule

Флаги — это дополнительные опции, указываемые в квадратных скобках после правила.

- `redirect|R[=code]` — выполняет редирект с указанным HTTP-кодом (по умолчанию 302):

RewriteRule ^/old$ /new [R=301,L]

 - `forbidden|F` — запрещает доступ с кодом 403:

RewriteRule ^/secret$ - [F]

 - `gone|G` — возвращает код 410 для "удалённых" страниц:

RewriteRule ^/deprecated$ - [G]

 - `proxy|P` — перенаправление через прокси:

RewriteRule ^/proxy/(.*)$ http://example.com/$1 [P]

 - `last|L` — завершает обработку текущего правила:

RewriteRule ^/stop$ /final.html [L]

 - `next|N` — перезапускает процесс преобразований:

RewriteRule ^/loop$ /loop2 [N]

 - `chain|C` — связывает текущее правило с последующим:

RewriteRule ^/step1$ /step2 [C]
RewriteRule ^/step2$ /final.html

 - `type|T` — задаёт MIME-тип:

RewriteRule ^/script$ /cgi-bin/script.cgi [T=application/x-httpd-cgi]

 - `nocase|NC` — делает шаблон нечувствительным к регистру:

RewriteRule ^/TeSt$ /result [NC]

 - `qsappend|QSA` — добавляет строку запроса к существующей:

RewriteRule ^/append$ /result?extra=value [QSA]

 - `noescape|NE` — запрещает экранирование специальных символов:

RewriteRule ^/special$ /result?key=$value [NE]

Комбинация условий и правил

Пример с условиями и флагами: 

```apache
RewriteEngine on

# Перенаправление на HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

# Блокировка доступа для определённых IP
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$
RewriteRule ^(.*)$ - [F]

 Этот код:
1. Перенаправляет пользователей с HTTP на HTTPS.
2. Блокирует доступ для IP-адреса `192.168.1.100`.

Модуль mod_rewrite — это мощный инструмент для настройки серверных маршрутов и перенаправлений. Правильное использование директив позволяет оптимизировать работу сайта и управлять запросами с высокой гибкостью.

Наследование и управление модулем mod_rewrite в .htaccess

Как вы правильно заметили, mod_rewrite имеет особенности в работе с директивами в файлах `.htaccess`. Вот основные моменты:

- Если в подкаталогах .htaccess нет директив mod_rewrite, то правила из родительского каталога (например, из главного конфигурационного файла сервера) наследуются.

- Когда в .htaccess в подкаталоге присутствует директива mod_rewrite, то переменные состояния этого модуля (например, RewriteEngine) по умолчанию становятся выключенными (`off`), даже если они были включены в родительском каталоге. Для того, чтобы активировать механизм преобразования в подкаталоге, необходимо указать директиву RewriteEngine on.

- Если нужно продолжить наследование правил из родительского каталога, необходимо добавить директиву RewriteOptions inherit в подкаталог. Она указывает серверу продолжать использовать настройки модификаций из верхнего уровня.

Пример:

```apache
RewriteEngine on
RewriteOptions inherit
```

Индексные страницы и управление доступом к каталогам

1. Запрещать листинг каталогов (показ списка файлов):
В случае, если каталог не содержит индексного файла (например, `index.html`), можно запретить пользователям видеть список файлов в каталоге с помощью директивы:

Options -Indexes

2. Разрешить листинг каталогов:
Для разрешения листинга каталогов (если нет индексных файлов), используйте:

Options Indexes

 3. Игнорирование файлов определённого типа в листинге:
Чтобы запретить отображение файлов определённого типа (например, скриптов PHP или Perl) в листинге каталога:

IndexIgnore *.php* *.pl

 4. Настройка индексных файлов:
Для того чтобы сервер искал другие файлы в качестве индексных, например, `index.cgi`, используйте директиву DirectoryIndex:

DirectoryIndex index.html index.shtml index.pl index.cgi index.php

 5. Указание специфичного индексного файла для определённых каталогов:
Чтобы при обращении к каталогу открывался не стандартный `index.html`, а, например, `htaccess.php`, укажите:

DirectoryIndex htaccess.php /cgi-bin/index.pl

Обработка ошибок (ErrorDocument)

Ошибка HTTP – это код возврата, который сообщает о проблемах при обработке запроса. Apache позволяет настроить собственные страницы ошибок для различных кодов состояния, чтобы обеспечить пользователю более понятные сообщения.

Пример конфигурации для обработки ошибок: 

```apache
# Перенаправление на собственные страницы ошибок
ErrorDocument 404 http://bg10.ru/error/404.htm
ErrorDocument 403 http://bg10.ru/error/403.htm
ErrorDocument 400 http://bg10.ru/error/400.htm
ErrorDocument 500 http://bg10.ru/error/500.htm
```

 Можно указать собственные страницы для различных ошибок, например, для 404 (не найдено) или 403 (запрещено). Важно помнить, что текстовое сообщение для ошибки 403 должно начинаться с кавычки:

```apache
ErrorDocument 403 "Sorry can't allow you access today, 403 Status Codes Apache"
```

 Эти страницы могут быть внешними URL или локальными файлами.

Также можно использовать ошибки с кодами состояния 4xx и 5xx для настройки поведения сервера при возникновении различных ошибок:

- 400 – Bad Request
- 401 – Unauthorized
- 403 – Forbidden
- 404 – Not Found
- 500 – Internal Server Error
- 502 – Bad Gateway
- 503 – Service Unavailable

Пример локальной страницы для ошибки 404:

```apache
ErrorDocument 404 /custom_errors/404.html
```

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

Кодировка и управление символами в .htaccess

1. Указание кодировки документа:
Веб-сервер Apache позволяет указать кодировку для всех документов, чтобы браузер корректно их распознавал. Например, если используется кодировка UTF-8 по умолчанию, нужно добавить в `.htaccess`:

```apache
AddDefaultCharset UTF-8
```

Это указывает серверу использовать кодировку UTF-8 для всех документов.

2. Указание кодировки исходных файлов:
Когда сервер должен перекодировать входящие файлы, можно указать кодировку, в которой они были сохранены. Для этого используется директива CharsetSourceEnc:

```apache
CharsetSourceEnc WINDOWS-1251
```

Этот параметр сообщает серверу, что все получаемые файлы должны интерпретироваться как Windows-1251.

 3. Отключение перекодировки:
Для отмены автоматической перекодировки файлов сервером можно использовать:

```apache
CharsetDisable on
```

 Эта директива отключает перекодировку символов в HTTP-запросах, если кодировка файлов не совпадает с указанной в директивах. 

htaccess1

Управление доступом с помощью .htaccess

1. Основы управления доступом (Order Allow,Deny):
Для контроля доступа к файлам и каталогам можно использовать директивы Order, Allow и Deny. Эти директивы определяют, кто имеет право на доступ к ресурсам.

- Order Allow,Deny — по умолчанию разрешается доступ всем, кроме тех, кто указан в директиве Deny.
- Order Deny,Allow — сначала запрещается доступ всем, а затем разрешается только тем, кто указан в директиве Allow.

2. Пример блокировки определенных IP-адресов:
Чтобы запретить доступ с определенных IP-адресов, можно использовать следующий код:

```apache
Order Allow,Deny
Allow from all
Deny from 81.222.144.12 81.222.144.20
```

 Это блокирует доступ с IP-адресов 81.222.144.12 и 81.222.144.20, разрешая доступ всем остальным.

3. Пример разрешения доступа только с определенных IP-адресов:
Чтобы разрешить доступ только с конкретных IP-адресов, можно использовать:

```apache
Order Deny,Allow
Deny from all
Allow from 81.222.144.12 81.222.144.20
```

 Это запретит доступ всем пользователям, за исключением тех, кто обращается с IP 81.222.144.12 и 81.222.144.20.

4. Контроль доступа к отдельным файлам:
Можно контролировать доступ не только к директориям, но и к отдельным файлам. Например, если нужно запретить доступ к файлу passwd.html для всех, кроме IP 81.222.144.12, используйте:

```apache
<Files "passwd.html">
Order Deny,Allow
Deny from all
Allow from 81.222.144.12
</Files>
```

 5. Контроль доступа к группе файлов:
Если нужно ограничить доступ к определенной группе файлов, например, все файлы с расширением `.key`, можно использовать:

```apache
<Files "\.(key)$">
Order Deny,Allow
Deny from all
Allow from 81.222.144.12
</Files>
```

Паролирование директорий

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

1. Конфигурация .htaccess для защиты папки: 

AuthName "Protected area, need authorization"
AuthType Basic
AuthUserFile /home/t/test/.authfile
require valid-user

 - AuthName — это имя защищенной области, которое будет отображаться в окне запроса пароля.
- AuthType — тип аутентификации, чаще всего используется Basic, так как Digest может не поддерживаться некоторыми браузерами.
- AuthUserFile — путь к файлу с паролями, который должен содержать список пользователей и их пароли, зашифрованные с использованием алгоритма htpasswd.
- require valid-user — указывает, что доступ будет разрешен всем пользователям, которые правильно аутентифицированы.

2. Создание файла с паролями (htpasswd):
Файл паролей (.authfile) должен быть создан отдельно. Для этого можно использовать утилиту htpasswd: 

htpasswd -c /home/t/test/.authfile username

 Этот инструмент создаст файл паролей и запросит ввод пароля для указанного пользователя.

Указание опций PHP в `.htaccess`

Для конфигурирования PHP через `.htaccess` можно использовать несколько директив, которые позволяют настроить поведение PHP-сценариев для разных каталогов на сайте. Директивы могут касаться как логических значений, так и числовых или строковых. Основные директивы:

1. `php_value`:
Используется для установки строковых и числовых значений. Пример:

```apache
php_value max_execution_time 30
php_value memory_limit 128M
```

Устанавливает максимальное время выполнения скриптов и максимальный лимит памяти для PHP.

 2. `php_flag`:
Используется для установки логических значений (включить/выключить). Пример:

```apache
php_flag display_errors on
php_flag display_startup_errors off
```

Включает вывод ошибок и предупреждений, а также отключает ошибки при запуске PHP.

 3. `php_admin_value` и `php_admin_flag`:
Эти директивы могут быть использованы только в конфигурационных файлах Apache, таких как `httpd.conf` или `apache2.conf`. Они не могут быть переопределены в `.htaccess` файле и предназначены для администраторов, чтобы применить значения на уровне всего веб-сервера.

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

1. Установка имени хоста и пользователя базы данных:

php_value mysql.default_host localhost
php_value mysql.default_user myuser
php_value mysql.default_password mypassword

 2. Разрешение вывода ошибок PHP:
Для вывода всех ошибок, включая предупреждения и ошибки при запуске PHP:

php_flag display_errors 1
php_flag display_startup_errors 1
php_value error_reporting 32767

 3. Отключение выполнения PHP в каталоге:
Чтобы запретить выполнение PHP в текущем каталоге и его подкаталогах:

php_flag engine off

Запрет на загрузку изображений с сайта

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

Пример конфигурации: 

```apache
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)?mysite.com/ [NC]
RewriteRule \.(gif|jpg|png)$ https://mysite.com/img/goaway.gif [NC]
```

 Замените `mysite.com` на домен вашего сайта, а `goaway.gif` — на изображение, которое будет отображаться на чужих сайтах, когда они пытаются заимствовать ваш контент.

Запрет на выполнение вредоносных скриптов

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

Пример защиты от инъекций: 

```apache
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index.php [F,L]
```

 Этот код проверяет параметры запроса на наличие признаков скриптовых инъекций (например, `<script>` или другие уязвимости в строках запроса) и блокирует такие запросы, возвращая ошибку 403 (Forbidden).

Чек-лист: Как не навредить сайту при работе с `.htaccess`

1. Бэкап:
Перед внесением изменений в `.htaccess` всегда делайте его резервную копию. Это позволит легко восстановить работоспособность сайта, если возникнут проблемы.

2. Наследование директив:
В дочерних `.htaccess` файлах указаны только новые или измененные директивы. Остальные директивы будут наследоваться от родительского каталога.

3. Удаление мусора:
После тестирования конфигурации очистите кеш браузера и данные для того, чтобы исключить старые или ошибочные записи из кеша.

4. Кириллица в URL:
URL на кириллице должен быть переведен в Punycode, иначе они могут быть неправильно обработаны веб-сервером или браузером.

Эти рекомендации помогут вам использовать `.htaccess` для тонкой настройки PHP, защиты контента и повышения безопасности сайта.