Htaccess в WordPress: правильная настройка без проблем
При первичной настройке блога важно разумно сделать все технические составляющие. В первую очередь исправить файл htaccess под WordPress, потому что он регулирует серверные настройки Apache. Статья написана как не нужно делать, а рекомендаций по внедрению кода минимум. Прочитайте внимательно и не делайте грубых ошибок.
Где лежит htaccess
Htaccess обязательно должен находится в корневой папке сайта, вместе с каталогами типа wp-admin. У меня лежит как показано на снимке, иначе работать не будет, сервер его не найдет.
Как создать чистый htaccess
По умолчанию WordPress 5 должен создать htaccess, либо хостер добавляет его в каталог ресурса. Но бывает, что отсутствует, тогда создаем документ на компьютере с названием .htaccess с помощью стандартного блокнота.
- В меню выбираем Файл > Сохранить как
- Появляется окно, в нем вписываем название и папку для сохранения
- Нажимаем на Сохранить
После можно загрузить чистый документ на сервер или редактировать локально на компьютере, а потом перенести.
Что нужно добавить в 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. При отказе добавляем такие строки в 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
, смотрим что выдает браузер.
Должна открыться пустая страница или произойти 301 переадресация на главную. Если покажется код документа, то нужно срочно его закрывать, просим помощи в поддержке, или прописываем вот такой текст.
<Files wp-config.php>
order allow,deny
deny from all
</Files>
Посетители спрашивают, а нужно ли добавлять правила для плагинов WooCommerce, BBPress, Elementor и им подобным. Отвечу – нет, все встроено в сами плагинах. Будет полезно прочитать как создавать robots txt. В заключении дам видео инструкцию, чтобы сделать процесс более понятным.
Вывод настройки
Настройка htaccess в WordPress не сложная, потому что разработчики и хостер сделали все условия, чтобы снизить количество ошибок. В статье показал правильный вариант, в котором только стандартные директивы и перенаправление на https, остальные функции должны быть встроены и работать изначально. В любом случае сначала пишем в поддержку, и только потом делаем сами.
Пожалуйста, оцените материал:
Здравствуйте! Подскажите пожалуйста, если основной домен без www, требуется ли прописывать перенаправление 301 редирект?
Здравствуйте. Да нужно если вы хотите сделать основным зеркалом домен без www.
Статья написана максимально упрощенным языком!
Спасибо за ваш труд!
Здравствуйте! Пользуюсь такими директивами:
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 для доп. защиты сайта?
Здравствуйте. Если они не дают ошибок, и сайт нормально индексируется то оставляйте. htpasswd да хороший способ защиты, так придется два раза подбирать логин и пароль.
Здравствуйте.
А если WordPress установлен не в корне сайта, а в папке?
То в каких строчках её прописывать?
Спасибо.
Здравствуйте. Вопрос не совсем понятен, в той папке где установлен WordPress это и есть корень сайта.
Корень домена 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.
Да тоже верное замечание.
Здрасти Валентин!
Уже сомнения терзают что вы ответите. Но всё же задам вопрос.
Есть ли такое правило, что бы первой к показу была страница index.html/ Очень надо. Весь рунет перерыла, не могу найти.
Может вооще такое невозможно?
Благодарю за помощь!
Привет. А почему терзают сомнения? Вы хотите вывести старицу не из движка WordPress?
Спасибор вам огромное за помощь!
Класс! Спасибо за информацию!
У меня (в отличии от оригинального файла Htaccess) есть еще 2 такие сточки:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Подскажите, они нужны? Или это лишнее что-то. Возможно, меня взломали? Спасибо.
Всё хорошо, это редирект на HTTPS.
Доброго времени подскажите что нужно прописать чтоб сайт работал без www если можно напишите код
Спасибо, сууууупер!!!
а как вам такое:
Установка языковой переменной на основе клиента
Чтобы определить язык браузера и перенаправить пользователя к соответствующей версии сайта, добавьте приведенное ниже правило в файл .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
И еще, хотела с вами поделиться какой бред у меня был прописан в 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
что это было?
Что добавить в htaccess, что бы не учитывался регистр букв в поисковой строке? Желательно что-бы отдавал ошибку 404.
Пример:
https://ваш-сайт.ru/htaccess-wordpress/
https://ваш-сайт.ru/HTACCESS-wordpress/
Получается это две одинаковых страницы (то есть дубли). И таких дублей можно сделать большое количество (особенно если название статьи большое).
Подскажите показывает что тройной редирект
http://www.мойсайт.ru
https://www.мойсайт.ru/
https://мойсайт.ru/
То есть -301-301-200
Как убрать ?
Сейчас настройки такие:
# 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