Настройка .htaccess для безопасности и производительности Apache

Источник: «36 Useful Apache ‘.htaccess’ Tricks for Security and Performance»
Файл .htaccess — мощный конфигурационный файл, используемый веб-серверами на базе Apache для управления и изменения настроек на уровне каталогов. Изменяя файл .htaccess, можно контролировать многие аспекты поведения веб-сайта, не прибегая к изменению настроек всего сервера.

Перенаправление

Для включения перенаправления, необходимо подключить модуль mod_rewrite в конфигурационном файле сервера Apache.

Модуль mod_rewrite использует механизм перенаправления на основе правил, основанных на парсере регулярных выражений PCRE, чтобы переписывать запрашиваемые URL на лету. По умолчанию mod_rewrite сопоставляет URL с путём к файловой системе. Однако его также можно использовать для перенаправления одного URL на другой.

Узнать больше о mod_rewrite можно в документации.

Перенаправление с HTTP на HTTPS

Если ваш сайт поддерживает HTTPS, важно перенаправить весь трафик с HTTP на HTTPS, для повышения безопасности и рейтинга в поисковых системах.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Перенаправление старых URL-адресов на новые

Если вы изменили структуру сайта, перенаправление старых URL на новые очень важно для поддержания SEO. Данный способ не использует mod_rewrite и меньше влияет на производительность сервера.

Redirect 301 /старый-url.html https://yourdomain.ru/новый-url.html

Создаётся постоянное перенаправление (301) со старого URL на новый. Для временного перенаправления, если по какой-либо причине вам нужно некоторое время перенаправлять пользователей на другую страницу используйте Redirect 307.

Перенаправление на страницу техобслуживания

Если ваш сайт находится на техническом обслуживании, можно перенаправить всех посетителей на страницу технического обслуживания:

RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteRule ^(.*)$ /maintenance.html [R=307,L]

Замените maintenance.html на ваш URL страницы обслуживания.

Перенаправление не-WWW на WWW

Чтобы обеспечить направление всего трафика на www-версию вашего домена:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Это перенаправит посетителей с yourdomain.ru на сайт www.yourdomain.ru.

Перенаправление WWW на не-WWW

Если вы предпочитаете не-www версию домена, используйте следующий код:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://yourdomain.ru/\ [L,R=301]

Это перенаправляет www.yourdomain.ru на yourdomain.ru.

Перенаправление на основе языковых предпочтений

Если у вас сайт на нескольких языках, можно перенаправить пользователей на соответствующую языковую версию сайта в зависимости от языковых настроек браузера:

RewriteEngine On
RewriteCond %{HTTP:Accept-Language} ^fr [NC]
RewriteRule ^$ /fr/index.html [L,R=302]

Этот пример перенаправляет пользователей с французским (fr) языковым предпочтением на французскую версию вашего сайта.

Настройка страницы ошибки

В .htacces или файле конфигурации сервера Apache можно подключить свой файл ошибки практически для любой ошибки сервера используя синтаксис:

ErrorDocument код_ошибки /путь_к_страницы_ошибки.html

Код ошибки можно посмотреть по следующим ссылкам:

Далее приведены типовые ошибки.

Настройка страницы ошибки 404 Not Found

Сначала нужно создать HTML-файл, служащий страницей ошибки 404 Not Found, в корневом каталоге документа веб-сайта, а затем добавить эту строку, чтобы указать вашу страницу 404. Эта страница поможет удержать пользователей, попадающих на несуществующие страницы.

ErrorDocument 404 /404.html

Настройка страницы ошибки 403 Forbidden

Как и в случае со страницей 404 Not Found, вы можете создать свою страницу 403 Forbidden.

ErrorDocument 403 /403.html

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

Настройка страницы ошибки 500 Internal Server Error

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

ErrorDocument 500 /500.html

Таким образом, вместо стандартного сообщения об ошибке сервера пользователи увидят более удобное сообщение, настроенное вами.

Настройка страницы ошибки 401 Unauthorized

Когда пользователи пытаются получить доступ к закрытой странице без надлежащей аутентификации, можно выдать собственную страницу ошибки 401 Unauthorized вместо стандартного сообщения сервера:

ErrorDocument 401 /401.html

Ограничение доступа и блокирование

Защита каталога паролем

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

AuthType Basic
AuthName "Restricted Area"
AuthUserFile /path/to/.htpasswd
Require valid-user

Создайте файл .htpasswd для хранения имён пользователей и паролей.

htpasswd -c .htpasswd username

Блокирование попыток SQL-инъекций

Можно заблокировать распространённые попытки SQL-инъекций:

RewriteEngine On
RewriteCond %{QUERY_STRING} (\<|%3C)(script|SELECT|INSERT|UPDATE|DELETE|DROP|UNION|;|\-\-) [NC]
RewriteRule .* - [F]

Блокирование определённых IP-адресов

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

<Limit GET POST>
order allow,deny
deny from 123.456.789.000
allow from all
</Limit>

Ограничение доступа к .htaccess

Чтобы защитить файл .htaccess от несанкционированного доступа, добавьте правило:

<Files .htaccess>
order allow,deny
deny from all
</Files>

Это гарантирует, что никто не сможет просмотреть содержимое файла .htaccess.

Блокирование хотлинкинга

Хотлинкинг — это когда другой сайт напрямую ссылается на ваши изображения, используя вашу пропускную способность. Чтобы предотвратить это, используйте:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [F]

Замените yourdomain.com на ваше доменное имя.

Блокирование хотлинкинга на изображения с предупреждающим изображением

Вы можете заменить изображения хотлинков предупреждающим изображением:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ https://yourdomain.com/warning.jpg [R,L]

Замените warning.jpg на ваше изображение предупреждения.

Запрет доступа к определённым типам файлов

Возможно, вам необходимо заблокировать доступ к определённым типам файлов, например к файлам конфигурации и логам (.ini, .log и .conf):

<FilesMatch "\.(ini|log|conf)$">
Order allow,deny
Deny from all
</FilesMatch>

Отключение просмотра каталогов

По умолчанию пользователи могут видеть список файлов в каталоге без индексной страницы, но это можно предотвратить, отключив просмотр каталога.

Options -Indexes

В результате вместо списка файлов будет показана ошибка 403 Forbidden.

Ограничение размера загружаемых файлов

Чтобы ограничить размер файлов, загружаемых на ваш сайт, используйте следующее правило:

php_value upload_max_filesize 10M
php_value post_max_size 10M

Запрет доступа к PHP файлам в определённых каталогах

В целях безопасности можно заблокировать доступ к PHP-файлам в определённых каталогах (например, uploads):

<Directory "/path/to/uploads">
<Files "*.php">
Order Deny,Allow
Deny from all
</Files>
</Directory>

Замените /path/to/uploads на фактический путь к каталогу.

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

Чтобы заблокировать доступ к каталогу с изображениями и при этом разрешить их загрузку на сайт:

<Directory "/path/to/images">
Order Deny,Allow
Deny from all
</Directory>

Блокировка определённых user agent

Если определённые боты или скреперы злоупотребляют вашим сайтом, их можно заблокировать по user agent:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} badbot [NC]
RewriteRule .* - [F,L]

Замените badbot на user agent, который необходимо заблокировать.

Ограничение доступа по странам

Чтобы заблокировать посетителей из определённых стран, необходим доступ к списку диапазонов IP-адресов этих стран.

Вот пример блокирования определённых диапазонов IP-адресов:

<Limit GET POST>
order allow,deny
deny from 123.456.789.
allow from all
</Limit>

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

Предотвращение доступа к резервным копиям файлам

Файлы резервных копий (например, .bak, .old) или логов (например, .log) иногда забывают на серверах, что приводит к раскрытию конфиденциальной информации.

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

<FilesMatch "\.(bak|old|log|sql)$">
Order allow,deny
Deny from all
</FilesMatch>

Ограничение доступа по Referrer

Можно контролировать, каким сайтам разрешено направлять трафик на ваш сайт. Например, блокировать доступ к сайту, если пользователь пришёл с определённого домена.

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https://www\.baddomain\.com [NC]
RewriteRule .* - [F]

Замените baddomain.com на сайт, который нужно заблокировать в качестве реферера.

Ограничение методов HTTP запросов

Для повышения безопасности можно ограничить методы HTTP запросов (например, GET, POST), допустимые на вашем сайте.

Например, можно заблокировать такие опасные методы, как TRACE или TRACK:

<LimitExcept GET POST>
Order Deny,Allow
Deny from all
</LimitExcept>

Ограничение доступа к разделу администрирования по IP-адресу

Если на сайте есть панель администрирования (например, /admin или /wp-admin), в целях безопасности целесообразно ограничить доступ к этому разделу по IP-адресу:

<Files "admin.php">
Order Deny,Allow
Deny from all
Allow from 123.456.789.000
</Files>

Замените 123.456.789.000 на свой IP-адрес. Только с этого IP будет разрешён доступ к файлу admin.php.

Ограничение доступа при проведении технического обслуживания сайта

Если необходимо перевести сайт в режим обслуживания, но разрешить доступ к нему определённым IP-адресам (например, вашему собственному), используйте этот способ:

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.000$
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteRule ^(.*)$ /maintenance.html [R=302,L]

Замените 123.456.789.000 на свой IP-адрес. Только посетители с этого IP-адреса смогут зайти на сайт, а остальные увидят страницу обслуживания.

Разное

Принудительная загрузка файлов

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

<FilesMatch "\.(pdf|zip|doc)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

Это позволит автоматически загружать PDF или ZIP-файлы при обращении к ним.

Установка заголовков Cache-Control

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

<FilesMatch "\.(jpg|jpeg|png|gif|js|css)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>

Это указывает браузерам кэшировать указанные файлы в течение 30 дней (2592000 секунд).

Установка заголовков Cache-Control с mod_expires.c

Если используется модуль mod_expires.c, можно установить заголовки управления кэшем с его помощью, указав браузерам, как долго кэшировать определённые типы файлов:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>

В примере установлено более длительное время кэширования для изображений по сравнению с CSS или JavaScript.

Включение GZip сжатия

Используя модуль mod_deflate.c с помощью GZip сжатия можно уменьшить размер файлов передаваемых браузеру, улучшив время загрузки:

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
AddOutputFilterByType DEFLATE application/javascript
</IfModule>

Включение CORS

Чтобы разрешить CORS для таких ресурсов, как шрифты или изображения, используйте:

<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>

Убедитесь, что модуль mod_headers.c подключён в файле конфигурации Apache.

Разрешить загрузку определённых типов файлов

Можно ограничить типы файлов загружаемых на сайт.

<FilesMatch "\.(php|cgi|pl|py)$">
Order Deny,Allow
Deny from all
</FilesMatch>

Включение логов доступа к файлам

Если необходимо отслеживать доступ к определённым файлам в целях аудита или мониторинга, можно включить ведение логов для определённых типов файлов:

SetEnvIf Request_URI "\.(pdf|doc|mp3)$" requested_file
CustomLog /path/to/logfile.log combined env=requested_file

Данный сниппет позволяет регистрировать доступ к файлам .pdf, .doc и .mp3 в отдельном лог-файле.

Установка набора символов по умолчанию

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

AddDefaultCharset UTF-8

Заключение

Эти советы и рекомендации по использованию .htaccess могут значительно повысить безопасность, производительность и удобство использования вашего сайта. Всегда делайте резервную копию файла .htaccess перед внесением изменений и тестируйте конфигурацию, чтобы убедиться, что сайт ведёт себя так, как ожидается.

Комментарии


Дополнительные материалы

Предыдущая Статья

ES2025: Promise.try — Унифицированная обработка ошибок

Следующая Статья

Понимание битовых сдвигов JavaScript: << и >>