post
Бесплатная школа YouTube 3.0

Файл .htaccess содержит в себе настройки для хостинг-серверов на базе linux. Многие не задумываются о важности правильной конфигурации файла .htaccess для сайта. А ведь от этого зависит безопасность вашего сайта и многие другие аспекты его работы.

Мы рассмотрим оптимальный файл .htaccess для сайта на WordPress.

1. Зачем нужен файл .htaccess?

В данном файле задается ряд важных настроек безопасности, кеширования, редиректов, сжатия файлов. Какие именно параметры можно настроить с помощью .htaccess для сайте на WordPress:

1) Безопасность:

  • Запрет листинга директорий (отображение всех содержащихся в директории файлов и папок).
  • Запрет различных SQL-инъекций (способ взлома сайта, основанный на внедрении в запрос произвольного SQL-кода).
  • Блокирование различных hacking tools (программ, скриптов для взлома сайта).
  • Защита ключевых конфигурационных файлов от доступа (файла wp-config.php, самого файла .htaccess и других).
  • Запрет прямого доступа к php, xml и ini файлам

2) Оптимизация загрузки и производительности сайта:

  • Оптимальный mod_headers (установка Vary: Accept-Encoding).
  • Настройка gzip-сжатия.
  • Настройка кеширования и периодов актуальности кеша (ExpiresByType).

3) Редиректы — перенаправления:

  • Включение mod_rewrite и перенаправлений.
  • 301 редирект — перенаправление с www.ваш-сайт.ru на ваш-сайт.ru либо наоборот.
  • 302 — документ перемещен временно.
  •  404 — файл не найден.
  • Другие редиректы, в том числе сложные.

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

Относитесь серьезно к безопасности вашего сайта!

2. Как создать файл .htaccess для вашего сайта?

Самый простой способ создания файла .htaccess — с помощью программы Total Commander.

  • Создаем с помощью блокнота или любого другого текстового редактора (к примеру, notepad++) файл htaccess.txt. Пока что это обычный текстовый файл.
  • Теперь открываем программу Total Commander, находим файл htaccess.txt, нажимаем правую кнопку мыши и выбираем «переименовать».

оптимальный htaccess для wordpress

  • Переименовываем htaccess.txt  в .htaccess (обратите внимание: имя файла пустое, а .htaccess — это расширение файла).
  • Сохраняем изменения.
  • Теперь нам нужно расположить файл .htaccess в корневой директории сайта (там же, где расположен файл wp-config.php).

Для этого используйте любой FTP-клиент для загрузки файла на хостинг (можно использовать тот же Total Commander или Filezilla).

оптимальный .htaccess

Пока что файл .htaccess пустой. Давайте наполним его содержимым.

3. Оптимальная конфигурация файла .htaccess для WordPress.

Внимание! Если вам не хочется вникать в детали — скачайте сразу оптимальный файл .htaccess для вашего сайта. После скачивания .htaccess закачайте в корневую папку сайта.

Оптимальный .htaccess для WordPress.(ссылка на Яндекс-диск).

  • Общие правила: все новые директивы настроек пишутся с новой строки. Чтобы закомментировать правило, поставьте в начале строки знак #
  • Важно: закомментированная строка не работает и служит как примечание для вебмастера.
  • Определенные модули параметров нажно заключать в секции, например <IfModule mod_headers.c> и </IfModule>.

Итак, рассмотрим какие секции файла .htaccess за что отвечают.

1) Закроем листинг файлов и папок:

Options +FollowSymLinks -Indexes

2) Включим mod_rewrite:

RewriteEngine On

3) Теперь добавим блок настроек безопасности:

# 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]
#
# Deny access to php, xml and ini files
# within components and plugins directories
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]
RewriteCond %{REQUEST_URI} \/components\/ [OR]
RewriteCond %{REQUEST_URI} ^\/includes\/|^\/administrator\/includes\/ [OR]
RewriteCond %{REQUEST_URI} \/language\/ [OR]
RewriteCond %{REQUEST_URI} \/libraries\/ [OR]
RewriteCond %{REQUEST_URI} \/modules\/ [OR]
RewriteCond %{REQUEST_URI} \/plugins\/ [OR]
RewriteCond %{REQUEST_URI} \/templates\/ [OR]
RewriteCond %{REQUEST_URI} \/xmlrpc\/
RewriteRule ^(.*)$ index.php [R=404,L]

# Prevent most common SQL-Injections
RewriteCond %{query_string} concat.*\( [NC,OR]
RewriteCond %{query_string} union.*select.*\( [NC,OR]
RewriteCond %{query_string} union.*all.*select [NC]
RewriteRule ^(.*)$ index.php [F,L]

# Block most common hacking tools
SetEnvIf user-agent «Indy Library» stayout=1
SetEnvIf user-agent «libwww-perl» stayout=1
SetEnvIf user-agent «Wget» stayout=1
deny from env=stayout

 4) Укажем редиректы, если это необходимо:

RewriteRule .* — [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
#
# If the requested path and file is not /index.php and the request
# has not already been internally rewritten to the index.php script
RewriteCond %{REQUEST_URI} !^/index\.php
# and the request is for something within the component folder,
# or for the site root, or for an extensionless URL, or the
# requested URL ends with one of the listed extensions
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|vcf|raw))$ [NC]
# and the requested path and file doesn't directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn't directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d
# internally rewrite the request to the index.php script
RewriteRule .* index.php [L]

 

5) Настроим gzip-сжатие:

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
<ifmodule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_item_include file \.js$
mod_gzip_item_include file \.css$ </ifmodule>
</IfModule>

 

6) Настроим кеширование и время актуальности кеша:

<IfModule mod_expires.c>
ExpiresActive On# Default expiration: 1 hour after request
ExpiresDefault «now plus 1 hour»# CSS and JS expiration: 1 week after request
ExpiresByType text/css «now plus 1 week»
ExpiresByType application/javascript «now plus 1 week»
ExpiresByType application/x-javascript «now plus 1 week»# Image files expiration: 1 month after request
ExpiresByType image/bmp «now plus 1 month»
ExpiresByType image/gif «now plus 1 month»
ExpiresByType image/jpeg «now plus 1 month»
ExpiresByType image/jp2 «now plus 1 month»
ExpiresByType image/pipeg «now plus 1 month»
ExpiresByType image/png «now plus 1 month»
ExpiresByType image/svg+xml «now plus 1 month»
ExpiresByType image/tiff «now plus 1 month»
ExpiresByType image/vnd.microsoft.icon «now plus 1 month»
ExpiresByType image/x-icon «now plus 1 month»
ExpiresByType image/ico «now plus 1 month»
ExpiresByType image/icon «now plus 1 month»
ExpiresByType text/ico «now plus 1 month»
ExpiresByType application/ico «now plus 1 month»
ExpiresByType image/vnd.wap.wbmp «now plus 1 month»
ExpiresByType application/vnd.wap.wbxml «now plus 1 month»
ExpiresByType application/smil «now plus 1 month»# Audio files expiration: 1 month after request
ExpiresByType audio/basic «now plus 1 month»
ExpiresByType audio/mid «now plus 1 month»
ExpiresByType audio/midi «now plus 1 month»
ExpiresByType audio/mpeg «now plus 1 month»
ExpiresByType audio/x-aiff «now plus 1 month»
ExpiresByType audio/x-mpegurl «now plus 1 month»
ExpiresByType audio/x-pn-realaudio «now plus 1 month»
ExpiresByType audio/x-wav «now plus 1 month»# Movie files expiration: 1 month after request
ExpiresByType application/x-shockwave-flash «now plus 1 month»
ExpiresByType x-world/x-vrml «now plus 1 month»
ExpiresByType video/x-msvideo «now plus 1 month»
ExpiresByType video/mpeg «now plus 1 month»
ExpiresByType video/mp4 «now plus 1 month»
ExpiresByType video/quicktime «now plus 1 month»
ExpiresByType video/x-la-asf «now plus 1 month»
ExpiresByType video/x-ms-asf «now plus 1 month»
</IfModule>

7) Настроим параметры mod_headers (Vary: Accept-Encoding)

<IfModule mod_headers.c>
<FilesMatch «\.(js|css|xml|gz)$»>
Header append Vary: Accept-Encoding
</FilesMatch>
</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>

 

8) Защищаем от несанкционированного доступа файл wp-config.php:

<Files wp-config.php>
# Запрещаем всем доступ к файлу wp-config.php
order allow,deny
deny from all
</Files>

 

9) Защищаем от доступа сам файл .htaccess:

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

 

10) Добавим правильную кодировку по умолчанию:

AddDefaultCharset utf-8

11) Перенаправление на домен без www:

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

Внимание: замените адрес site.ru на адрес вашего сайта!

12) Перенаправление с домена без www на адрес с www:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^site\.ru
RewriteRule ^(.*)$ http://www.site.ru/$1 [R=permanent,L]

Внимание: замените адрес site.ru на адрес вашего сайта! Выберите только один вариант перенаправления: либо на www, либо на без www.


Все, мы указали все необходимые параметры в файле .htaccess для WordPress. Не забудьте сохранить файл после добавления кода.

Бесплатная школа YouTube 3.0

Поделитесь этой записью с друзьями, буду благодарен!

37 комментариев “Оптимальный .htaccess для WordPress

  1. Спасибо, есть варианты для начинающих, и для тех, кто хочет разбираться. )

  2. Автор, статья супер, но хочу кое-что спросить.

    Насчет пункта 4) Укажем редиректы, если это необходимо: — объясните подробнее, кому надо это прописывать, а кому не надо?

    Пункт 5) Настроим gzip-сжатие: — то же самое. Не ляжет ли из-за этого сайт? Можно ли как-то заранее выяснить?

    7) Настроим параметры mod_headers (Vary: Accept-Encoding) — это вообще зачем???

    10) Добавим правильную кодировку по умолчанию: AddDefaultCharset utf-8 — всем ли нужно у себя это прописывать? Мой сайт вроде и без этого нормально работает.

    • 4) Редиректы нужны, к примеру, чтобы убрать из ссылок часть index.php. В иных случаях можно не прописывать их.

      5) Ну если сайт ляжет — просто удалите gzip-сжатие. Большинство нормальных хостингов поддерживает корректно включение сжатия.

      7) mod_headers обеспечивает правильное кеширование, что важно для ускорения работы сайта и уменьшения нагрузки на сервер.

      10) русские хостинги уже имеют включенную кодировку utf-8 по умолчанию. Однако эта опция очень помогает в случае импортных хостингов или дешевых наших.

  3. И вдогонку еще вопрос. Я люблю размещать на форумах ссылки на картинки со своего сайта. Если использовать ваш код для htaccess, останется ли такая возможность? Если нет, то что нужно поменять, чтобы она осталась?

    • Если размещаете просто ссылки — проблем не будет, а если же встраиваете картинки с сайта в записи на форумах, то это называется «хотлинкинг». Он запрещается примерно таким кодом:

      RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC] RewriteCond %{HTTP_REFERER} !^$ RewriteRule .*\.(jpe?g|gif|png)$ <a href="http://i.imgur.com/qX4w7.gif">i.imgur.com/qX4w7.gif</a> [L]

      Такой код по умолчанию я обычно не включаю в файл .htaccess

  4. Похоже у вас ошибки — установил на сайт, сразу — internal server error. Методом исключений нашел где ошибки. В этом коде:

    "

    # 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})

    ".

    • Ошибок здесь нет. Однако некоторые хостинги не в полной мере поддерживают параметры безопасности в файле htaccess. Работать ли с такими хостингами — философский вопрос.

  5. # Deny access to php, xml and ini files

    # within components and plugins directories

    RewriteCond %{REQUEST_FILENAME} -f

    RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]

    RewriteCond %{REQUEST_URI} \/components\/ [OR]

    RewriteCond %{REQUEST_URI} ^\/includes\/|^\/administrator\/includes\/ [OR]

    RewriteCond %{REQUEST_URI} \/language\/ [OR]

    RewriteCond %{REQUEST_URI} \/libraries\/ [OR]

    RewriteCond %{REQUEST_URI} \/modules\/ [OR]

    RewriteCond %{REQUEST_URI} \/plugins\/ [OR]

    RewriteCond %{REQUEST_URI} \/templates\/ [OR]

    RewriteCond %{REQUEST_URI} \/xmlrpc\/

    RewriteRule ^(.*)$ index.php [R=404,L]

    Вот эта часть вроде как для джумлы. Нет?

    • В принципе да, эта часть для джумлы, папки такие, но это не страшно.

  6. Спасибо за подробное описание!

    Правда пришлось удалить RewriteCond %{REQUEST_URI} \/plugins\/ [OR], некоторые плагины из-за неё не работали, точнее css файлы не подключались :(

    Кстати, для защиты админки (wp-admin) использую

    SetEnvIf Remote_Addr «^xxx\.xxx\.xxx\.xxx» GrantAccessModified

    Эффективно ли это для защиты ?

    • В принципе для защиты админки проще настроить плагин iThemes Security: изменить адрес для входа в админ. панель, добавить капчу, лимит попыток авторизации, блокировку по ip. Можно сделать двойную авторизацию, задав пароль на папку в файле .htaccess, добавленном в папку wp-admin.

  7. Если установить такой файл, не помешает ли это работе плагинов?

    • С плагина конфликтов не замечено. Но вот некоторые неполноценные хостинги его не воспринимают, но это редко.

  8. Скажите а если на сайте уже есть файл htaccess , то делать замену на новый .htaccess: или оставлять оба?

    • Если файл уже есть, сделайте его резервную копию и замените на новый.

      • я заменил ну он почему то не хочет работать... А когда я оставляю 2 то все работает.

  9. Не нашел в файле пункты 11 и 12 (те, где нужно менять название сайта). Просмотрел несколько раз, но нету там такого!

    • Для современного WordPress эти пункты не требуются. Однако для других CMS будут актуальны (к примеру, для Joomla).

  10. Еще вопрос: при попытке изменить настройки постоянных ссылок с «По умолчанию» на «Название записи» или «Произвольно» наверху появляется надпись: «Теперь необходимо обновить файл .htaccess» и внизу: «Если бы ваш файл .htaccess был доступен для записи, мы могли бы выполнить следующий шаг автоматически, но это не так. Вот правила mod_rewrite, которые должны быть в файле .htaccess. Кликните на поле и нажмите CTRL + a, чтобы выделить весь текст», а еще ниже текст, предложенный для копирования:

    RewriteEngine On

    RewriteBase /

    RewriteRule ^index\.php$ — [L]

    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule . /index.php [L]

    Но ведь он есть в файле, который Вы выложили для скачивания?

    И страница, которая создана для проверки, не видна — выходит ошибка:

    Not Found

    The requested URL /proverochnaya-stranitsa was not found on this server.

    Почему так происходит и можно ли как-то это исправить?

    • В моем файле этот код есть, но вы все же проверьте, есть ли данный ком у вас в файле htaccess на сайте. Если там нет — добавьте.

      • Так я же заменил htaccess на сайте на тот, который здесь. Я сделал что-то неправильно?

  11. Короче, после установки файла с предложенными изменениями, сайт рухнул могу попасть только на Главную страницу, вернул старый родной файл но все равно кроме главной ни чего не открывается.

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

    Что делать?!!

    • Разрулил, написал в поддержку хостинга, вот ответ от хостинг компании

      «Исправили проблему. Вы не использовали стандартный .htaccess с правилами».

      Хотя я потом после вашего варианта возвращал ихний, но почему то не работало все равно.

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

      Ну, будет мне и другим урок.

      • Скорее всего проблема на стороне хостинга — проблема с правами на файлы (когда файл не удалялся) + не установлены некоторые необходимые дополнения php (падение сайта с новым htaccess).

  12. Три дня безплодных поисков... Нервы... на пределе. Уже хотел распрощаться с WordPress. А, проблема была в «.htaccess»! Денис, Вы меня спасли!

  13. Странно, но с Вашим файлом все начинает дико тормозить. Нагрузка на сервер возросла! втрое! Скажите, что я делаю не так и с чем это может быть связано?

    • Файл включает gzip-сжатие, это повышает нагрузку на сервер. Можете удалить фрагмент, отвечающий за это.

  14. Спасибо вам огромное за помощь. Мне приходили сообщения от техподдержки, что нагрузка на хостинг зашкаливает. С вашей помощью поменяла файлы htaccess и robots. Буду ждать результатов.

  15. Здравствуйте Денис.

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

    Подскажите пожалуйста какой из них будет надежней. Оставить существующий или заменить его на предложенный в данной статье?

    Спасибо!

    • Добрый день! Можно оставить тот, который в сборке. Из статьи надежнее, но у него меньше совместимость с хостингами.

  16. Скажите а какое отношение к WordPress имеет вот этот участок кода:

    # Deny access to php, xml and ini files # within components and plugins directories RewriteCond %{REQUEST_FILENAME} -f RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC] RewriteCond %{REQUEST_URI} \/components\/ [OR] RewriteCond %{REQUEST_URI} ^\/includes\/|^\/administrator\/includes\/ [OR] RewriteCond %{REQUEST_URI} \/language\/ [OR] RewriteCond %{REQUEST_URI} \/libraries\/ [OR] RewriteCond %{REQUEST_URI} \/modules\/ [OR] RewriteCond %{REQUEST_URI} \/plugins\/ [OR] RewriteCond %{REQUEST_URI} \/templates\/ [OR] RewriteCond %{REQUEST_URI} \/xmlrpc\/ RewriteRule ^(.*)$ index.php [R=404,L]

    на сколько я понимаю это относится к Joomla )))

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *