[![Как увеличить скорость WordPress и защитить свой сайт при помощи .htaccess без каких-либо плагинов 1](https://coma.lv/wp-content/uploads/2024/12/Gemini_Generated_Image_armnw7armnw7armn.webp)](https://coma.lv/wp-content/uploads/2024/12/Gemini_Generated_Image_armnw7armnw7armn-1030x575.webp)

# Как увеличить скорость WordPress и защитить свой сайт при помощи .htaccess без каких-либо плагинов

Dec 17, 2024/by [Vadim Pavlovich](https://coma.lv/ru/author/djcoma/)

Вам нужно защитить свой сайт на WordPress? Тогда вот вам хороший способ, который потребует использовать ТОЛЬКО .htaccess

## Что такое .htaccess

Под .htaccess называют конфигурационный файл на серверах под Apache. Размещенный в соответствующей директории, файл обнаруживается и обрабатывается софтом Apache. Этот файл используется для включения и отключения функций, которыми располагает Apache. Среди этих функций есть функции с редиректом для страниц 404, а также более продвинутые вещи вроде запрета на хотлинкинг изображений, управление сжатием кэша, защита контента паролями и многое другое, об этом можно узнать [здесь](http://www.htaccess-guide.com/).

## Как все это работает?

У меня есть мысль избегать огромных библиотек от множества плагинов и настроек, которые я размещаю на сервере. Для этой цели я использую .htaccess

## Включить в WordPress Gzip, используя .htaccess

Чтобы включить у себя в Вордпрессе gzip вам нужно включить mod_deflate.c и использовать подходящие фильтры. Например, эти:

<ifmodule mod_deflate.c> AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/text AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE image/gif AddOutputFilterByType DEFLATE image/jpeg AddOutputFilterByType DEFLATE image/jpg AddOutputFilterByType DEFLATE image/png AddOutputFilterByType DEFLATE image/gif AddOutputFilterByType DEFLATE image/flv AddOutputFilterByType DEFLATE image/ico AddOutputFilterByType DEFLATE image/swf AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/json AddOutputFilterByType DEFLATE video/3gpp AddOutputFilterByType DEFLATE video/3gpp2 AddOutputFilterByType DEFLATE video/x-flv AddOutputFilterByType DEFLATE video/jpm AddOutputFilterByType DEFLATE video/jpeg AddOutputFilterByType DEFLATE video/x-m4v AddOutputFilterByType DEFLATE video/mp4 AddOutputFilterByType DEFLATE video/ogg AddOutputFilterByType DEFLATE video/webm AddOutputFilterByType DEFLATE video/quicktime AddOutputFilterByType DEFLATE audio/x-mpegurl AddOutputFilterByType DEFLATE audio/midi AddOutputFilterByType DEFLATE audio/mp3 AddOutputFilterByType DEFLATE audio/mp4 AddOutputFilterByType DEFLATE audio/mpeg AddOutputFilterByType DEFLATE audio/webm AddOutputFilterByType DEFLATE audio/basic AddOutputFilterByType DEFLATE audio/x-wav AddOutputFilterByType DEFLATE audio/wav # Fix Browsers BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html </ifmodule>

В этом примере разобраны все важные типы медиа, которые вам нужны. Включив это у себя в .htaccess, вы получите наилучшую производительность и загрузочное время для своего сайта. Единственным исключением является Mozilla, в некоторых версиях которой нет поддержки Gzip.

## Настройка кэша WordPress внутри .htaccess

Если вы хотите ускорить свой сайт путем кэширования яваскриптов, CSS и картинок, то вы можете запросто настроить это через .htaccess, включив mod_expires.c

# Expires - 2678400s = 31 days <ifmodule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 seconds" ExpiresByType text/html "access plus 7200 seconds" ExpiresByType image/gif "access plus 2678400 seconds" ExpiresByType image/jpeg "access plus 2678400 seconds" ExpiresByType image/png "access plus 2678400 seconds" ExpiresByType text/css "access plus 518400 seconds" ExpiresByType text/javascript "access plus 2678400 seconds" ExpiresByType application/x-javascript "access plus 2678400 seconds" </ifmodule>

В моем примере я использую кэш на протяжении 31 дня. Вы можете поменять эту настройку на ту, которая нужна именно вам. А вот код для headers:

# Cache Headers <ifmodule mod_headers.c> # Cache specified files for 31 days <filesmatch "\.(ico|flv|jpg|jpeg|png|gif|css|swf)$"> Header set Cache-Control "max-age=2678400, public" </filesmatch> # Cache HTML files for a couple hours <filesmatch "\.(html|htm)$"> Header set Cache-Control "max-age=7200, private, must-revalidate" </filesmatch> # Cache PDFs for a day <filesmatch "\.(pdf)$"> Header set Cache-Control "max-age=86400, public" </filesmatch> # Cache Javascripts for 31 days <filesmatch "\.(js)$"> Header set Cache-Control "max-age=2678400, private" </filesmatch> </ifmodule>

Вы можете настроить параметр max-age как вам самим это заблагорассудится.

## Защищаем установку WordPress через .htaccess

На самом деле Wodpress весьма уязвим для взломщиков, но вы можете сделать их работу труднее. Да, есть плагины, которые предлагают неплохую защиту, но в некоторых случаях .htaccess может быть куда более эффективным решением.

# Disable directory browsing Options All -Indexes # Deny access to wp-config.php file <files wp-config.php> order allow,deny deny from all </files> # Deny access to xmlrpc.php file *** REMOVE THIS IF YOU WANT TO ACCESS IT *** <files xmlrpc.php> order allow,deny deny from all </files> # Deny access to all .htaccess files <files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </files> # Block wp-includes folder and files <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule> # Block Massive attacks <IfModule mod_rewrite.c> RewriteEngine On # Block out any script trying to base64_encode data within the URL. RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR] # Block out any script that includes a <script> tag in URL. RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR] # Block out any script trying to set a PHP GLOBALS variable via URL. RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] # Block out any script trying to modify a _REQUEST variable via URL. RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) # Return 403 Forbidden header and show the content of the root homepage RewriteRule .* index.php [F] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Disable user agents from this locations SetEnvIfNoCase User-Agent "^Missigua Locator" bad_bot #SetEnvIfNoCase User-Agent "^PEAR HTTP_Request class" bad_bot SetEnvIfNoCase User-Agent "^Java/1.4.1" bad_bot SetEnvIfNoCase User-Agent "^Java/1.5.0" bad_bot SetEnvIfNoCase User-Agent "^psycheclone" bad_bot SetEnvIfNoCase User-Agent "^WEP Search 00" bad_bot SetEnvIfNoCase User-Agent "^FlashGet" bad_bot SetEnvIfNoCase User-Agent "^GetRight" bad_bot SetEnvIfNoCase User-Agent "^GetWeb!" bad_bot SetEnvIfNoCase User-Agent "^Go!Zilla" bad_bot SetEnvIfNoCase User-Agent "^httplib" bad_bot SetEnvIfNoCase User-Agent "^Indy Library" bad_bot SetEnvIfNoCase User-Agent "^InfoNaviRobot" bad_bot SetEnvIfNoCase User-Agent "^InterGET" bad_bot SetEnvIfNoCase User-Agent "^Internet Ninja" bad_bot SetEnvIfNoCase User-Agent "^LexiBot" bad_bot SetEnvIfNoCase User-Agent "^libWeb/clsHTTP" bad_bot SetEnvIfNoCase User-Agent "^libwww" bad_bot SetEnvIfNoCase User-Agent "^libwww-perl" bad_bot SetEnvIfNoCase User-Agent "^LinkextractorPro" bad_bot SetEnvIfNoCase User-Agent "^Mozilla.*NEWT" bad_bot SetEnvIfNoCase User-Agent "^Octopus" bad_bot SetEnvIfNoCase User-Agent "^ProWebWalker" bad_bot SetEnvIfNoCase User-Agent "^SuperBot" bad_bot SetEnvIfNoCase User-Agent "^WebAuto" bad_bot SetEnvIfNoCase User-Agent "^Wells Search II" bad_bot SetEnvIfNoCase User-Agent "^Wget" bad_bot SetEnvIfNoCase User-Agent "^wget" bad_bot <Limit GET POST> order allow,deny allow from all deny from env=bad_bot </Limit> </IfModule>

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

Следующей мерой защиты было отключение прямого доступа к файлам *.htaccess*, *xmlrpc.php* и *wp-config.php*.

Важное примечание: если вам требуется файл *xmlrpc.php*, то вам нужно убрать соответствующую часть кода.

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

Последней мерой защиты была защита от спама и хакерских атак, исходящих от различных пауков и роботов.

## Выводы

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

# Enable GZIP <ifmodule mod_deflate.c> AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/text AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE image/gif AddOutputFilterByType DEFLATE image/jpeg AddOutputFilterByType DEFLATE image/jpg AddOutputFilterByType DEFLATE image/png AddOutputFilterByType DEFLATE image/gif AddOutputFilterByType DEFLATE image/flv AddOutputFilterByType DEFLATE image/ico AddOutputFilterByType DEFLATE image/swf AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/json AddOutputFilterByType DEFLATE video/3gpp AddOutputFilterByType DEFLATE video/3gpp2 AddOutputFilterByType DEFLATE video/x-flv AddOutputFilterByType DEFLATE video/jpm AddOutputFilterByType DEFLATE video/jpeg AddOutputFilterByType DEFLATE video/x-m4v AddOutputFilterByType DEFLATE video/mp4 AddOutputFilterByType DEFLATE video/ogg AddOutputFilterByType DEFLATE video/webm AddOutputFilterByType DEFLATE video/quicktime AddOutputFilterByType DEFLATE audio/x-mpegurl AddOutputFilterByType DEFLATE audio/midi AddOutputFilterByType DEFLATE audio/mp3 AddOutputFilterByType DEFLATE audio/mp4 AddOutputFilterByType DEFLATE audio/mpeg AddOutputFilterByType DEFLATE audio/webm AddOutputFilterByType DEFLATE audio/basic AddOutputFilterByType DEFLATE audio/x-wav AddOutputFilterByType DEFLATE audio/wav # Fix Browsers BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html </ifmodule> # Expires Headers - 2678400s = 31 days <ifmodule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 seconds" ExpiresByType text/html "access plus 7200 seconds" ExpiresByType image/gif "access plus 2678400 seconds" ExpiresByType image/jpeg "access plus 2678400 seconds" ExpiresByType image/png "access plus 2678400 seconds" ExpiresByType text/css "access plus 518400 seconds" ExpiresByType text/javascript "access plus 2678400 seconds" ExpiresByType application/x-javascript "access plus 2678400 seconds" </ifmodule> # Cache Headers <ifmodule mod_headers.c> # Cache specified files for 31 days <filesmatch "\.(ico|flv|jpg|jpeg|png|gif|css|swf)$"> Header set Cache-Control "max-age=2678400, public" </filesmatch> # Cache HTML files for a couple hours <filesmatch "\.(html|htm)$"> Header set Cache-Control "max-age=7200, private, must-revalidate" </filesmatch> # Cache PDFs for a day <filesmatch "\.(pdf)$"> Header set Cache-Control "max-age=86400, public" </filesmatch> # Cache Javascripts for 31 days <filesmatch "\.(js)$"> Header set Cache-Control "max-age=2678400, private" </filesmatch> </ifmodule> # Disable directory browsing Options All -Indexes # Deny access to wp-config.php file <files wp-config.php> order allow,deny deny from all </files> # Deny access to xmlrpc.php file *** REMOVE THIS IF YOU WANT TO ACCESS IT *** <files xmlrpc.php> order allow,deny deny from all </files> # Deny access to all .htaccess files <files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </files> # Block wp-includes folder and files <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule> # Block Massive attacks <IfModule mod_rewrite.c> RewriteEngine On # Block out any script trying to base64_encode data within the URL. RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR] # Block out any script that includes a <script> tag in URL. RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR] # Block out any script trying to set a PHP GLOBALS variable via URL. RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] # Block out any script trying to modify a _REQUEST variable via URL. RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) # Return 403 Forbidden header and show the content of the root homepage RewriteRule .* index.php [F] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Disable user agents from this locations SetEnvIfNoCase User-Agent "^Missigua Locator" bad_bot #SetEnvIfNoCase User-Agent "^PEAR HTTP_Request class" bad_bot SetEnvIfNoCase User-Agent "^Java/1.4.1" bad_bot SetEnvIfNoCase User-Agent "^Java/1.5.0" bad_bot SetEnvIfNoCase User-Agent "^psycheclone" bad_bot SetEnvIfNoCase User-Agent "^WEP Search 00" bad_bot SetEnvIfNoCase User-Agent "^FlashGet" bad_bot SetEnvIfNoCase User-Agent "^GetRight" bad_bot SetEnvIfNoCase User-Agent "^GetWeb!" bad_bot SetEnvIfNoCase User-Agent "^Go!Zilla" bad_bot SetEnvIfNoCase User-Agent "^httplib" bad_bot SetEnvIfNoCase User-Agent "^Indy Library" bad_bot SetEnvIfNoCase User-Agent "^InfoNaviRobot" bad_bot SetEnvIfNoCase User-Agent "^InterGET" bad_bot SetEnvIfNoCase User-Agent "^Internet Ninja" bad_bot SetEnvIfNoCase User-Agent "^LexiBot" bad_bot SetEnvIfNoCase User-Agent "^libWeb/clsHTTP" bad_bot SetEnvIfNoCase User-Agent "^libwww" bad_bot SetEnvIfNoCase User-Agent "^libwww-perl" bad_bot SetEnvIfNoCase User-Agent "^LinkextractorPro" bad_bot SetEnvIfNoCase User-Agent "^Mozilla.*NEWT" bad_bot SetEnvIfNoCase User-Agent "^Octopus" bad_bot SetEnvIfNoCase User-Agent "^ProWebWalker" bad_bot SetEnvIfNoCase User-Agent "^SuperBot" bad_bot SetEnvIfNoCase User-Agent "^WebAuto" bad_bot SetEnvIfNoCase User-Agent "^Wells Search II" bad_bot SetEnvIfNoCase User-Agent "^Wget" bad_bot SetEnvIfNoCase User-Agent "^wget" bad_bot <Limit GET POST> order allow,deny allow from all deny from env=bad_bot </Limit> </IfModule> # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress

Но учтите, что перед тем, как вы попробуете наш код, ОБЯЗАТЕЛЬНО позаботьтесь о соответствующих резервных копиях.

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

Вы также должны понимать, что это не универсальное решение. Если вы хотите более высокую скорость, улучшенную оптимизацию и лучшую конверсию, то вы должны сделать множество других вещей, чтобы получился именно тот результат, которого вы хотите. Или же нанять себе дизайнера, который на всем этом деле собаку съел.

---

*Наша специальность — разработка и поддержка сайтов на WordPress. Контакты для бесплатной консультации — [vadim@coma.lv](mailto:vadim@coma.lv), [+371 29394520](tel:+37129394520)*

---
