Htaccess в WordPress: правильная настройка без проблем

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

Где лежит htaccess

Htaccess обязательно должен находится в корневой папке сайта, вместе с каталогами типа wp-admin. У меня лежит как показано на снимке, иначе работать не будет, сервер его не найдет.

Где находится htaccess
Где располагается объект

Как создать чистый htaccess

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

Делаем файл доступов в блокноте
Создать в блокноте
  1. В меню выбираем Файл > Сохранить как
  2. Появляется окно, в нем вписываем название и папку для сохранения
  3. Нажимаем на Сохранить

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

Что нужно добавить в htaccess обязательно

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

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

Стандартный htaccess

Если htaccess не было изначально, то нужно добавить стандартный код, который WordPress прописывает при установке.

# 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

301 редирект на https

Если к ресурсу прикреплен SSL сертификат, то необходимо занести после #BEGIN WordPress конфигурацию 301 редиректа.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Как должен выглядеть правильный htaccess

В итоге правильный код htaccess должен выглядеть так:

# BEGIN WordPress
RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
<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

Он проверен на множестве сайтов и работает безотказно. Никаких дублей, дыр в безопасности и остальных ошибок не наблюдали.

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

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

Что еще можно подключить в htaccess

Хостинги разные, поэтому не все предоставляют услуги внутренней оптимизации сервера, тогда приходится вручную прописывать правила в htaccess. Спросите заранее в поддержке хостера, включены ли такие услуги как:

  • Кэш браузера
  • Gzip сжатие
  • Защита wp-config, нет ли доступа его просмотреть

Кэш браузера

Для начала проверим активен ли кэш браузера на сайте, переходим на сервис webpagetest, вводим в поле url главной страницы и находим start scan.

Определяем ошибки в серверной оптимизации
Проверка функций блога

Ждем процесса проверки и смотрим на результаты. Ищем строчку Leverage browser caching и определяем кэшируются ли документы. В моем случае да, исключение – метрика, аналитика и vk, на них повлиять нельзя.

Определение наличия кэша браузера
Есть ли кеш браузера

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

<ifModule mod_headers.c>
<FilesMatch "\.(html|htm)$">Header set Cache-Control "max-age=43100</FilesMatch>
<FilesMatch "\.(js|css|txt)$">Header set Cache-Control "max-age=604700</FilesMatch>
<FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">Header set Cache-Control "max-age=2591000"</FilesMatch>
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">Header unset Cache-Control</FilesMatch>
</IfModule>

Gzip сжатие

Gzip сжатие потеряло актуальность при появлении AMP и Турбо страниц, но пользоваться ими нужно. Проверяем тем же сервисом webpagetest, только ищем строчку «Use gzip compression for transferring compressable responses».

Есть ли сжатие gzip на сервере WordPress
Наличие gzip сжатия

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

<ifModule mod_gzip.c>
  mod_gzip_on Yes
  mod_gzip_dechunk Yes
  mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
  mod_gzip_item_include mime ^application/x-javascript.*
  mod_gzip_item_include mime ^text/.*
  mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
  mod_gzip_item_exclude mime ^image/.* 
  mod_gzip_item_include handler ^cgi-script$
</ifModule>

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

  • Beget
  • Timeweb
  • Masterhost

Для безопасности и защиты wp-config

В 99,9% проблемы нет, но перестраховаться стоит. Заходим на сайт и приписываем к адресу /wp-admin.php, смотрим что выдает браузер.

Показан ли wp-config
Отображение wp-config

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

<Files wp-config.php>
order allow,deny
deny from all
</Files>

Посетители спрашивают, а нужно ли добавлять правила для плагинов WooCommerce, BBPress, Elementor и им подобным. Отвечу – нет, все встроено в сами плагинах. Будет полезно прочитать как создавать robots txt. В заключении дам видео инструкцию, чтобы сделать процесс более понятным.

Вывод настройки

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

Пожалуйста, оцените материал:

Давно занимаюсь и разрабатываю сайты на Wordpress. Считаю что лучшего решения для ведения бизнеса не найти, поэтому считаю долгом делиться информацией с остальными.
Получай полезные материалы удобным способом!
Комментарии:
  1. Здравствуйте! Подскажите пожалуйста, если основной домен без www, требуется ли прописывать перенаправление 301 редирект?

    1. Здравствуйте. Да нужно если вы хотите сделать основным зеркалом домен без www.

  2. Статья написана максимально упрощенным языком!
    Спасибо за ваш труд!

  3. Здравствуйте! Пользуюсь такими директивами:

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR]
    RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
    RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
    RewriteRule ^(.*)$ index.php [F,L]

    Order Allow,Deny
    Deny from all

    order allow,deny
    deny from all
    satisfy all

    Стоит ли их удалить?

    И как вы считаете стоит ли использовать .htpasswd для доп. защиты сайта?

    1. Здравствуйте. Если они не дают ошибок, и сайт нормально индексируется то оставляйте. htpasswd да хороший способ защиты, так придется два раза подбирать логин и пароль.

  4. Здравствуйте.
    А если WordPress установлен не в корне сайта, а в папке?
    То в каких строчках её прописывать?
    Спасибо.

    1. Здравствуйте. Вопрос не совсем понятен, в той папке где установлен WordPress это и есть корень сайта.

      1. Корень домена site.ru
        При установке WordPress указывается директория, например, wp
        В файловой структуре на хостинге и это выглядит примерно так: site.ru/wp
        1. Соответственно, при открытии в браузере site.ru (если не настроены редиректы — все чистое по умолчанию), то будет
        «Forbidden
        You don’t have permission to access this resource.
        Additionally, a 403 Forbidden error was encountered while trying to use an ErrorDocument to handle the request»»
        2. если открывать в браузере урл site.ru/wp, то поднятый сайт на вордпрессе откроется прекрасно.

        Уверен, Евгений, выше написал именно эту ситуацию. По умолчанию при установке так и происходит. Надо править htaccess.

  5. Здрасти Валентин!
    Уже сомнения терзают что вы ответите. Но всё же задам вопрос.
    Есть ли такое правило, что бы первой к показу была страница index.html/ Очень надо. Весь рунет перерыла, не могу найти.
    Может вооще такое невозможно?
    Благодарю за помощь!

    1. Привет. А почему терзают сомнения? Вы хотите вывести старицу не из движка WordPress?

  6. У меня (в отличии от оригинального файла Htaccess) есть еще 2 такие сточки:

    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

    Подскажите, они нужны? Или это лишнее что-то. Возможно, меня взломали? Спасибо.

  7. Доброго времени подскажите что нужно прописать чтоб сайт работал без www если можно напишите код

  8. Спасибо, сууууупер!!!
    а как вам такое:

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

    RewriteCond %{HTTP:Accept-Language} ^.*(ro|fr|it|ru|en).*$ [NC]

    RewriteRule ^(.*)$ — [env=prefer-language:%1]

    МОЖНО ВСТАВИТЬ ЭТОТ КОД? мне очень понравилась эта функция (хоть у меня всего два языка, я удалю лишние), и куда лучше его вставить здесь:

    # BEGIN WordPress
    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ — [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress

  9. И еще, хотела с вами поделиться какой бред у меня был прописан в htacess до вашей чудесной статьи.
    Выскажите свое профессиональное мнение, пожалуйста!

    SetOutputFilter DEFLATE

    # Netscape 4.x has some problems…
    BrowserMatch ^Mozilla/4 gzip-only-text/html

    # Netscape 4.06-4.08 have some more problems
    BrowserMatch ^Mozilla/4\.0[678] no-gzip

    # MSIE masquerades as Netscape, but it is fine
    # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

    # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
    # the above regex won’t work. You can use the following
    # workaround to get the desired effect:
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

    # Don’t compress images
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary

    # Make sure proxies don’t deliver the wrong content
    Header append Vary User-Agent env=!dont-vary

    что это было?

  10. Что добавить в htaccess, что бы не учитывался регистр букв в поисковой строке? Желательно что-бы отдавал ошибку 404.

    Пример:
    https://ваш-сайт.ru/htaccess-wordpress/
    https://ваш-сайт.ru/HTACCESS-wordpress/

    Получается это две одинаковых страницы (то есть дубли). И таких дублей можно сделать большое количество (особенно если название статьи большое).

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