Эта статья предназначена для тех, у кого пока нет своего сайта, и для владельцев сайтов, которые хотят повысить их юзабилити и поднять свой сайт в результатах поиска.
Что такое .htaccess ? Содержание
Определение .htaccess ?
Файл .htaccess – (от английского hypertext access) — файл дополнительной конфигурации веб-сервера Apache, а также подобных ему серверов. Позволяет задавать большое количество дополнительных параметров и разрешений для работы веб-сервера в отдельных каталогах (папках), таких как управляемый доступ к каталогам, переназначение типов файлов и т.д., без изменения главного конфигурационного файла.
Файл .htaccess может содержаться как в корневом каталоге сайта, и тогда его действия распространяются на весь сайт, либо в других каталогах, и тогда его действие будет распространяться на эти каталоги.
Изменения файла .htaccess может серьёзно повлиять на работу сайта. Может нарушить работу.
Так же необдуманные действия с этим файлом могут не иметь видимых последствий, но серьёзно повлиять на изменение позиций в поисковой выдаче, поэтому мы рекомендуем сохранять копию файла .htaccess где-нибудь у себя на компьютере, чтобы потом иметь возможность вернуть прежние настройки обратно.
Где находится файл .htaccess?
Обычно файл .htaccess располагается в корневом каталоге сайта.
Наглядный пример расположения файла .htaccess в корневом каталоге:
Как проверить работоспособность в .htaccess?
Все просто, напишите в первой строчке этого файла любое слово (например MOYSITE), сохраните файл и замените им находящийся на сервере. Если сайт продолжит работать, то .htaccess в данный момент не работает. Если же появится ошибка 500 Internal Server Error, то это значит, что веб-сервер не смог понять команду (MOYSITE) и выдал ошибку. Этот факт подтвердит, что работа .htaccess на сервере поддерживается и включена в данный момент. Чтобы вернуть сайту работоспособность удалите строчку с MOYSITE.
Синтаксис .htaccess
Синтаксис файла простой: каждая директива (команда) начинается с новой строки, после знака # можно добавлять комментарии, которые не будут учитываться сервером. Изменения на сайте вступают в силу сразу, перезагрузка сервера не требуется.
Правила задаются в том числе при помощи регулярных выражений. Для того, чтобы их прочитать, нужно понимать значение спецсимволов и переменных. Расшифруем самые часто используемые.
Основные спецсимволы:
- ^ — начало строки;
- $ — конец строки;
- . — любой символ;
- * — любое количество любых символов;
- ? — один определенный символ;
- [0-9] — последовательность символов, например, от 0 до 9;
- | — символ «или», выбирается или одна группа, или другая;
- () — иcпользуется для выбора групп символов.
Основные переменные:
-
- %{HTTP_USER_AGENT} — поле User-Agent, которое передает браузер пользователя;
- %{REMOTE_ADDR} — IP адрес пользователя;
- %{REQUEST_URI} — запрашиваемый URI;
- %{QUERY_STRING} — параметры запроса после знака ?.
Примеры использования файла .htaccess
- Редирект 301 и 302, при помощи .htaccess, его правильная настройка, использование, случаи применения.
- Обработка ошибок
- Настройка безопасности сайта
- Оптимизация работы сайта
- Настройка PHP
Редирект 301 и 302, при помощи .htaccess, его правильная настройка, использование, случаи применения
Это самый популярный способ использования .htaccess. Перед тем, как настраивать тот или иной вид переадресации, убедитесь, что это действительно необходимо. Например, редирект на страницы со слешем в некоторых CMS настроен по умолчанию.
ВАЖНО!
При настройке редиректов страниц не настроить случайно цепочки редиректов. Используйте редирект той или иной страницы не более одного раза. В случае цепочки редиректов вы можете запутать поисковый робот, и это очень отрицательно скажется как на позициях отдельных страниц, так и на позиции сайта целиком.
Настраиваем постраничные 301 редиректы
Это потребуется в следующих случаях:
- изменилась структура сайта и у страницы поменялся уровень вложенности;
- страница перестала существовать, но нужно сохранить ее входящий трафик (например, в случае отсутствия товара обычно делают переадресацию на товарную категорию);
- поменялся URL, что крайне нежелательно, но тоже встречается.
Просто удалить страницу очень плохо. Страница будет удалена, но “внутри интернета” она сохранится. Поисковики будут к ней обращаться, и получать 404 ответ от сервера. Лучше перенаправить его на другой URL. В этом случае есть шанс не потерять позиции сайта в выдаче и целевой трафик. Настроить 301 редирект с одной страницы на другую можно при помощи директивы простого перенаправления:
ВАЖНО!
Если вы хотите, чтобы ваш редирект работал, нужно перед строками, которые рекомендуются ниже по тексту, обязательно прописать
RewriteEngine On
Закомментировать директиву можно поставив # в начале строки.
301 Редирект с одной страницы на другую (или сайт)
Для этого в файл .htaccess вносим следующие строки:
# Redirect starts
Redirect / старая-страница.html новая-страница.html
# Redirect ends
302 Редирект с одной страницы на другую (или сайт) – временный редирект. Совсем не рекомендуем его использовать. Применяется, если редирект временный.
RedirectPermanent /старая-страница.html новая-страница.html
301 Редирект с www-сайта на сайт без www
Определять, с «www» или без будет главное зеркало, можно несколькими способами:
- добавить сайт в Яндекс.Вебмастер в двух вариантах, в консоли отобразится информация, какой URL поисковик считает главным зеркалом;
- проанализировать выдачу и посмотреть, каких страниц сайта больше в индексе;
- для нового ресурса не имеет значения, с «www» или без будет адрес, выбор за вами.
Иногда, по ошибке, Яндекс.Вебмастер неправильно определяет главное зеркало, и проще помочь ему переопределиться прямо в Яндекс.Вебмастере.
Например перенаправление с http://www.site.com на http://site.com. Это очень полезная вещь, часто используется в SЕО
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Обратный редирект с домена без www на домен с www
Перенаправление с http://site.com на http://www.site.com (не советуем использовать)
# Redirect starts
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www \.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.% {HTTP_HOST}/$1 [R=301,L]
# Redirect ends
Редирект со старого домена на новый
Самая очевидная причина настройки этого редиректа — переадресовать роботов и пользователей на другой адрес при переезде сайта на новый домен.
RewriteEngine On
RewriteRule ^(.*)$ https://www.mysite2.ru/$1 [R=301,L]
Или
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.mysite1\.ru$ [NC]
RewriteRule ^(.*)$ https://www.mysite2.ru/$1 [R=301,L]
Где «mysite1» и «mysite2» — имя ваших сайтов на старый и новый домен соответственно.
Как добавить .html в конце URL?
Чтобы при вводе mysite.ru/page или mysite.ru/page/ происходило перенаправление на mysite.ru/page.html пишем в .htaccess следующее:
RewriteCond %{REQEST_URI} (./*[^/.]+)($|\?)
RewriteRule .* %1.html [R=301,L]
RewriteRule ^(.*)/$ /$1.html [R=301,L]
Как убрать .html в конце URL?
Обратный редирект с mysite.ru/page.html на mysite.ru/page
RewriteBase /
RewriteRule (.*)\.html$ $1 [R=301,L]
Избавляемся от дублей
Каждая страница сайта должна быть доступна только по одному адресу. Для этого должны быть настроены:
- редирект на страницы со слешем в конце URL или наоборот;
- главное зеркало — основной адрес сайта в поиске.
Сделать это можно при помощи модуля mod_rewrite. В его составе используются специальные команды — директивы сложного перенаправления. Первой командой всегда идет включение преобразования URL:
RewriteEngine On
Убрать слэш
Настроить ли переадресацию на страницы со слешем или без, в каждом случае нужно решать индивидуально. Если у сайта уже накоплена история в поиске, анализируйте, каких страниц в индексе больше. Для новых сайтов обычно настраивают редирект на слеш. Проверить, не настроена ли переадресация по умолчанию, просто: удалите/добавьте слеш в конце URL. Если страница перезагрузится с новым адресом — мы имеем дубли, требуется настройка. Если URL подменяется — все в порядке. Проверять лучше несколько уровней вложенности.
Современные CMS, например, WordPress настраивают слеш в конце строки по умолчанию.
Как убрать слэш в конце URL?
Например было mysite.com/page/, стало mysite.com/page
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]
301 Редирект с одного раздела на другой
Перенаправление всех страниц одного раздела mysite.com/razdel-1/razdel-2/page на на страницы другого раздела mysite.com/razdel-1/page
RewriteEngine On
RewriteRule ^blog/raznoe/(.*)$ https://mysite.ru/blog/$1 [R=реrmanent,L]
Изменение страниц ошибок через .htaccess
Когда пользователь хочет увидеть сайт (отправляет запрос на сервер хостера), то сервер возвращает ему ответ с кодом. Коды 1-399 свидетельствуют о нормальной работе сервера, а коды 400-599 сообщают об ошибке сервера.
Например, если сервер с вашим сайтом перегружен, или у него происходит перезагрузка, то пользователь увидит текст ошибки (например, 500 Internal Server Error), подумает, что сайт больше не будет работать и больше никогда на него не вернется. Наиболее распространенным решением является составление собственной страницы вместо стандартной 404-ошибки. Эта ошибка показывается пользователю, если введен адрес несуществующей страницы.
Далее подробно о том как создать кастомную страницу 404 смотрите здесь
Если Вы хотите вручную подставить созданную страницу 404 тогда в .htaccess необходимо добавить следующую строку:
ErrorDocument 404 https://mysite/404.html
Настройки безопасности сайта через .htaccess
Кроме функций перечисленных выше, можно так же улучшить безопасность сайта с помощью .htaccess с наиболее популярными на тройками мы вас сейчас познакомим:
Защита сайта от скриптовых инъекций
Смысл этой защиты в том, что становится невозможно добавить посторонние ссылки на сайт.
# Включает отслеживание сим-ссылок
Options +FollowSymLinks
# Запускает url rewriting
RewriteEnging On
# Блокирует все ссылки, содержащие <script>
RewtiteCond %{QUERY_STRONG} (\<|%3C).*script.*(\>|%3E) [NC,OR]
# Блокирует все скрипты, которые пытаются изменить переменные PHP Globals:
RewtiteCond %{QUERY_STRONG} GLOBALS(=|\[\%[0-9A-Z]{0,2}) [OR]
# Блокирует все ссылки, которые пытаются изменить переменную _REQUEST:
RewtiteCond %{QUERY_STRONG} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Перенаправляет все подобные попытки на страницу с ошибкой 403 – запрещено
RewtiteRule ^(.*)$ index.php [F,L]
100% гарантий защиты не является. Это одна из составляющих полноценной защиты.
Защита сайта от кражи картинок.
Если узнать путь к картинке у вас на сайте, а это довольно легко сделать и вставить его в код своей страницы, то основная страница будет загружаться с его сервера, а картинка – с вашего. Это позволяет ему экономить свой трафик и использовать ваш.
Options +FollowSymlinks
#Запрещает кражу картинок
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?mysite.ru/ [nc]
RewriteRule .*.(gif|jpg|png)$ https:// mysite.ru/images/stop_stealing.gif[nc]
mysite.ru – адрес вашего сайта. https:// mysite.ru/images/stop_stealing.gif — путь к картинке, которую вы сами должны создать. На ней обычно пишут «не крадите картинки с чужих сайтов» или что-то подобное.
Как заблокировать доступ к сайту для пользователя по IP?
Применяется против спамеров и прочих нежелательный посетителей, изредка для предотвращения хакерских атак.
#Вносим сюда нежелательные IP адреса
Allow from all
Deny from 164.186.15.125
Deny from 124.153.34.176
Во многих CMS существуют плагины “антиспам”, которые предотвращают подобные действия.
Как заблокировать доступ к сайту для всех IP кроме проверенных?
Не совсем понятно, зачем это кому-нибудь может пригодится, но тем не менее это возможно.
#Запрещает доступ для всех, кроме указанных IP-адресов
ErrorDocument 403 https://mysite.ru
Order deny, allow
Deny from all
Deny from 164.186.15.125
Deny from 124.153.34.176
Запрет просмотра содержимого конкретной папки.
#Запрещает просмотр содержимого папки
Options All –Indexes
Запрет доступа к конкретному файлу
#Защищает файл myfile.txt
<files myfile.txt>
order allow,deny
deny from all
</files>
Запрет доступа ко всем файлам с конкретным расширением
Например, чтобы запретить доступ ко всем файлам .txt пишем так:
<Files «\.(txt)$»>
Order Deny,Allow
Deny from all
Блокировка нежелательных User Agent-ов
Часто у пользователя в браузере установлено очень много расширений, которые передают серверу (на котором расположен ваш сайт) информацию о себе. Ту же информацию посылают на сервер клиентские приложения, установленные на компьютере пользователя, а также различные роботы и пауки. Различного рода пауки могут создавать излишнюю нагрузку на ваш сервер, что негативно сказывается не только на работе сервера, но и на SEO. Роботы не всегда могут отличить активность человека, от активности паука, и из-за излишней активности со стороны, могут блокировать ваш сайт в выдаче.
#Блокирует нижеперечисленных User Agent-ов
SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
<limit get=»» post=»» head=»»>
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</limit>
Изменение кодировки сайта через .htaccess
Бывает так, что один пользователь заходит к вам на сайт и видит его нормальным, а другой видит неизвестные символы вместо букв. Это происходит из-за кодировки сайта. Чтобы браузер пользователя правильно ее распознал, сайт делается в одной из популярных кодировок:
- UTF-8 — универсальная двухбайтовая кодировка
- Windows-1251 — Кириллица (Windows)
- KOI8-r — Кириллица (КОИ8-Р)
- cp866 — Кириллица (DOS)
- Windows-1250 — Центральная Европа (Windows)
- Windows-1252 — Западная Европа (Windows)
Также кодировку нужно указывать в мета-теге каждой страницы сайта, это сообщает браузеру в какой кодировке сделан сайт.
<meta http-eqiv=”content-tipe=”text/html; charset=Windows-1251”>
Если данный мета-тег не указан, то можно сообщить браузеру какая у вас кодировка с помощью файла .htaccess:
AddDefaultCharset WINDOWS-1251
Если работают оба варианта (и мета-тег, и файл .htaccess), то очень важно, чтобы кодировка в них совпадала.
Также есть возможность, чтобы сервер автоматически перекодировал все файлы, которые на него загружаются:
CharsetSourceEnc WINDOWS-1251
Чтобы выключить перекодировку сервера нужно вписать:
CharsetDisable on
Оптимизация работы сайта через .htaccess
Ускорение работы сайта через Gzip
Включение данной утилиты позволяет серверу сжать информацию перед тем, как он отправит ее пользователю. В итоге скорость работы сайта возрастет, но это немного увеличит нагрузку на сервер (на котором хранится ваш сайт), т.к. ему придется выполнять операцию сжатия на лету. Чтобы включить Gzip-сжатие в файл .htaccess нужно добавить следующие строки (попробуйте поочередно добавить 3 варианта кода, проверяя скорость здесь, и оставьте тот вариант, который дает наибольшее ускорение):
<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>
Или
FileETag MTime Size
<ifmodule mod_expires.c>
<filesmatch «.(jpg|jpeg|gif|png|ico|css|js)$»>
ExpiresActive on
ExpiresDefault «access plus 1 month»
</filesmatch>
</ifmodule>
Или
<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 handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
В случае использования WordPress все эти директивы в .htaccess дописывают специальные плагины, например: WP Fastest Cache.
Как улучшить кэширование сайта на сервере?
Улучшенное кэширование позволяет не загружать второй раз данные (картинки, основные элементы дизайна и т.д.), которые уже были загружены пользователем в момент первого просмотра сайта. Таким образом для конкретно взятого пользователя, вторая и последующие просмотренные страницы загрузятся гораздо быстрее, а нагрузка на ваш сервер существенно снизится. Улучшить кэширование сайта можно с помощью следующего кода (пробуйте по очереди два варианта и оставляйте наиболее быстрый, скорость проверяем здесь):
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType application/javascript «access plus 7 days»
ExpiresByType text/javascript «access plus 7 days»
ExpiresByType text/css «access plus 7 days»
ExpiresByType image/gif «access plus 7 days»
ExpiresByType image/jpeg «access plus 7 days»
ExpiresByType image/png «access plus 7 days»
</IfModule>
Или
FileETag MTime Size
<ifmodule mod_expires.c>
<filesmatch «.(jpg|gif|png|css|js)$»>
ExpiresActive on
ExpiresDefault «access plus 1 month»
</filesmatch>
</ifmodule>
В выражении «access plus …» устанавливается срок хранения файлов на компьютере пользователя. По истечении этого срока при запросе к сайту файлы будут единоразово загружены с сервера. Оптимальным будет от 7 дней до месяца, хотя можно устанавливается и год.
Изменение главной (индексной) страницы сайта
Как правило, при переходе на сайт сначала загружается страница index.html или index.php. Чтобы изменить это правило (в начале станет загружаться mypage.php), добавляем в .htaccess такой код:
DirectoryIndex about.html
Изменение главной (индексной) страницы сайта
ВАЖНО!
Использование любой директивы для настройки РНР напрямую зависит от версии РНР, которая установлена на сервере и от ограничений самого хостера. Потому если какая-то директива не отработала или ее использование привело к ошибке на сайте (и вы уверены, что задали ее верно) - обратитесь в техподдержку хостера и уточните о причинах и способах устранения возникшей ошибки.
Обычно за настройки PHP отвечает файл php.ini, но часть этих настроек можно задать через .htaccess. Для этого используются два выражения: php_value — для логических значений (например включить\выключить) и php_flag для числовых значений. Вот правила написания этих выражений:
php flag директива1 ЗНАЧЕНИЕ1
php flag директива2 ЗНАЧЕНИЕ2
где ЗНАЧЕНИЕ1 может быть on, off, 1 или 0 (1 и on — означает включить, а 0 и off — выключить);
ЗНАЧЕНИЕ2 — любое числовое или буквенное значение, которое подходит под конкретную директиву;
директива1 (используется только с php_flag) может иметь значения:
magic quote gpc
— вкл\выкл функцию magic_quotes_gpc
php_flag magic_quotes_gpc on
ВАЖНО!
Эта директива считается устаревшей и в более новых версиях PHP (начиная от 5.4.0) была отключена.
display_startup_errors
— вкл\выкл показ ошибок, которые происходят при работе PHP
php_flag display_startup_errors 1
display_errors
— вкл\выкл показ ошибки в браузер
php_flag display_errors 1
output_buffering
— вкл\выкл буферизацию вывода данных
>php_flag output_buffering on
register_globals
— вкл\выкл глобальные переменные
php_flag register_globals on
engine
— вкл\выкл исполнение PHP в папке в которой находится .htaccess и во всех вложенных
php_flag engine off
директива2 (используется только с php_value) может иметь такие значения:
upload_max_filesize
— устанавливает максимальный размер загружаемого файла
php_value upload_max_filesize 10M
user_agent
— задает значение строки user_agent, которую передает сервер
php_value user_agent “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)”
post_max_size
— задает максимальный размер пересылаемой почты
php_value post_max_size 10M
mysql.default_user
— задает имя пользователя базы данных
php_value mysql.default_user databaseuser
mysql.default_password
— задает пароль для пользователя БД
php_value mysql.default_password jk323jh4g
mysql.default_host
— задает имя хоста БД (обычно это localhost)
php_value mysql.default_host localhost
sendmail_from
— задает e-mail для отправки почты с помощью PHP
php_value sendmail_from
auto_prepend_file
— задает файл, который будет добавлен в начало каждого PHP-скрипта
php_value auto_prepend_file /www/publiс_html/myfile.php
auto_append_file
— задает файл, который будет добавлен в конец каждого PHP-скрипта
php_value auto_append_file /www/publiс_html/myfile.php
Обратите внимание на то, что не все хостеры разрешают менять настройки PHP через .htaccess. Мы рекомендуем уточнить у техподдержки этот момент.
На что обратить внимание при работе с файлом .htaccess?
ВАЖНО!
Поскольку с помощью .htaccess можно менять некоторые настройки веб-сервера хостера, то рекомендуем уточнить у техподдержки (или почитать FAQ хостера) относительно использования тех или иных директив.
Хостер может либо запретить использование каких-то директив, либо одни директивы могут быть заменены на другие, в зависимости от версии Apache.
К примеру, у некоторых хостеров запрещено использовать в .htaccess функцию преобразования в верхний регистр в связи с тем, что их работа значительно увеличивает нагрузку на веб-сервер.
Рекомендуем также обратить внимание на следующие директивы:
Ohtions +FollowSymLinks может быть заменена на Options +SymLinkOwenerMatch
Ohtions All-Indexes может быть заменена на Options-Indexes
Некоторые директивы вообще могут не использоваться для данной версии Apache и их нужно будет либо удалить, либо закомментировать.
Закомментировать директиву можно поставив # в начале строки.
Поэтому для того, чтобы вместо сайта не увидеть ошибку, связанную с файлом .htaccess, настоятельно рекомендуем изначально узнать какие директивы можно использовать для его настройки.
Заключение
.htaccess очень полезный и необходимый файл, но его неправильная настройка может привести к фатальным последствиям для вашего сайта. Поэтому мы рекомендуем либо обратиться к специалистам для его настройки, либо делать настройку пошагово, с обязательным резервным копированием баз данных при изменении .htaccess. При серьёзных его изменениях, обязательно консультироваться с службой поддержки хостера.