.htaccess като инструмент за ускорение, сигурност и контрол
Файлът .htaccess е мощен инструмент за управление на поведението на Apache сървъра.
Когато се използва стратегически, той може да подобри производителността, да ограничи нежелан достъп и да наложи стандарти за сигурност и кеширане — без да се докосва до приложението.
1. Блокиране на заявки към несъществуващи, но често атакувани пътища
Options -Indexes
RedirectMatch 410 ^/(admin|cms|backup|api|wp-content|\.git)
Какво прави: Options -Indexes забранява автоматичното показване на съдържание в директории без index файл.
RedirectMatch 410 отказва достъп до често атакувани пътища с код 410 Gone — съобщение, че ресурсът не съществува и няма да се върне.
Защо: Ботовете често сканират за административни панели, CMS, бекъпи и други уязвими точки. Дори да не съществуват, тези заявки натоварват сървъра и издават поведение.
Кога: Винаги, когато искаме да откажем достъп до шаблонни пътища, които не използваме, но знаем, че се атакуват.
Практика: Използваме 410 вместо 403, защото е по-тихо и не издава наличието на ресурс. Това не е защита на реални директории, а превантивен отказ към ботове.
2. Блокиране на нежелани потребителски агенти
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} (AhrefsBot|MJ12bot|python|zgrab) [NC]
RewriteRule ^.*$ - [F,L]
Какво прави: Блокира празни и агресивни ботове, които не носят стойност.
Защо: За да запазим ресурси и да намалим ненужния crawl.
Кога: Когато искаме да ограничим достъпа до сайта само за реални потребители и полезни ботове.
Практика: Използваме [NC] за нечувствителност към регистъра и [F,L] за отказ и край на обработката.
3. Компресия само за текстови ресурси
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript
SetEnvIfNoCase Request_URI \.(?:jpg|png|webp)$ no-gzip
</IfModule>
Какво прави: Компресира HTML, CSS и JS файлове, но изключва изображения.
Защо: Gzip компресията ускорява зареждането на текстови ресурси, но не е ефективна за изображения.
Кога: Винаги, освен ако не използваме CDN с автоматична компресия.
Практика: Изключваме изображенията с SetEnvIfNoCase, за да избегнем двойна компресия.
4. Кеш контрол за статични и динамични ресурси
<FilesMatch "\.(js|css|png|jpg|svg)$">
Header set Cache-Control "max-age=31536000, immutable"
</FilesMatch>
<FilesMatch "\.(html|php)$">
Header set Cache-Control "max-age=600, private, must-revalidate"
</FilesMatch>
Какво прави: Статичните ресурси се кешират агресивно, динамичните — внимателно.
Защо: Кешът намалява натоварването и ускорява сайта.
Кога: Винаги, но с различни стойности според типа ресурс.
Практика: Използваме immutable за файлове, които не се променят, и private за чувствителни страници.
5. Затягане на сигурността чрез HTTP headers
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Content-Security-Policy "frame-ancestors 'none';"
Header unset X-Powered-By
Какво прави: Предотвратява MIME sniffing, clickjacking и изтичане на информация.
Защо: За да защитим потребителите и да скрием технологията зад сайта.
Кога: Винаги — това са базови защитни мерки.
Практика: Премахваме X-Powered-By, за да не издаваме какво използваме.
Заключение
.htaccess не е заместител на добра архитектура, но е ценен инструмент за контрол и оптимизация. Когато се използва правилно, той подобрява производителността, ограничава нежелан достъп и налага стандарти за сигурност и кеширане. В нашите проекти използваме подобни техники, за да гарантираме бързина, стабилност и контрол — без компромис със стила или функционалността.