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