Ниже перечислены 19 возможных способов использования .htaccess для самых разных целей и приведены примеры кода.
Предназначение и расположение .htaccess
Этот файл позволяет управлять работой сервера с помощью особых команд, не меняя при этом ничего в главном конфигурационном файле, вроде .httpd.conf или apache.conf. Так вебмастера могут проводить настройку, особенно если у них нет доступа к главному файлу.
Пользуясь директивами в .htaccess, вы сможете настроить переадресацию для улучшения SEO, повысить безопасность, настроить отображение сайта в браузерах посетителей и улучшить время загрузки.
Расположение и редактирование файла
Если .htaccess расположен в корневой папке, то он будет задавать параметры для всего сайта. Если же поместить его в каталог, то он будет влиять только на этот каталог, и его директивы будут приоритетнее директив из корня. Можно иметь несколько версий этого файла: в разных каталогах и/или в корневой папке.
Также в некоторых CMS можно изменять файл с помощью административной панели. Например, в “Битрикс” он находится довольно легко, достаточно зайти в раздел “Контент – Файлы и папки”:
Даже если файл .htaccess отсутствует, можно просто создать его в любом текстовом редакторе и поместить его куда вам надо. Нужен всего лишь доступ к хостингу или по ftp.
Разметка файла .htaccess
У разметки файла .htaccess очень простые правила:
- каждая команда начинается с новой строки
- текст после знака # серверов не учитывается и может быть использован для комментарией
- все изменения вступают в силу сразу же, без перезагрузки
Один из способов установки правил – регулярные выражения. Необходимо понимать спецсимволы и переменные для их чтения.
Основные спецсимволы:
- ^ — начало строки;
- $ — конец строки;
- . — любой символ;
- * — любое количество любых символов;
- ? — один определенный символ;
- [0-9] — последовательность символов, например, от 0 до 9;
- | — символ «или», выбирается или одна группа, или другая;
- () — используется для выбора групп символов.
Основные переменные:
- %{HTTP_USER_AGENT} — поле User-Agent, которое передает браузер пользователя;
- %{REMOTE_ADDR} — IP адрес пользователя;
- %{REQUEST_URI} — запрашиваемый URI;
- %{QUERY_STRING} — параметры запроса после знака ?.
Настройка редиректов для SEO.
Это самый популярный способ применения .htaccess, но некоторые CMS уже имеют включенную переадресацию на страницы со слешем. Вы можете прочитать в нашем блоге о настройках переадресации для SEO.
Два главных правила:
1. Идущие подряд последовательные перенаправления нагружают сервер и замедляют работу сайта, избегайте их.
2. Организуйте перенаправления от частных к глобальным.
1. Настройка 301 редиректов между страницами.
Когда и зачем это нужно:
- при изменении уровня вложенности у отдельной страницы;
- если данной страницы больше нет;
- при изменении URL.
Достаточно использовать команды простого перенаправления для 301 редиректа:
- Redirect 301 /page1/ https://mysite.com/page2/
/page1/ — адрес страницы от корня, домен и протокол не указываем. Пример: /catalog/ofisnaya-mebel/kompjuternye-stoly/.
https://mysite.com/page2/ — полный адрес страницы переадресации. Пример: https://dom-mebeli.com/ofisnaya-mebel/stoly-v-ofis/.
2. Удаление дублей.
У каждой страницы должен быть лишь один адрес. Для этого необходимо настроить две вещи:
- переадресацию на страницы со слешем и без.
- “главное зеркало” — главный адрес сайта.
Для этого используется модуль mod_rewrite. Первой из них всегда идёт команда, запускающая изменения URL:
- RewriteEngine On
Куда перенаправить: на слеш или нет?
Каждый вебмастер решает сам, куда лучше перенаправлять. Если у вас сайт новый, то обычно переадресация будет на страницу со слешем. Если же он существует достаточно долго, то лучше проверить, какие страницы чаще встречаются в индексе.
Можно проверить, нет ли редиректа по умолчанию, просто добавив или удалив слеш в конце адреса. Если произойдёт загрузка с новым адресом, то имеется дубль и нужна настройка. Лучше провести проверку с разными уровнями вложенности.
Код 301 редиректа на слеш:
- RewriteCond %{REQUEST_URI} /+[^.]+$
- RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
Код 301 редиректа на страницы без слеша:
- RewriteCond %{REQUEST_URI} !?
- RewriteCond %{REQUEST_URI} !&
- RewriteCond %{REQUEST_URI} !=
- RewriteCond %{REQUEST_URI} !.
- RewriteCond %{REQUEST_URI} ![^/]$
- RewriteRule ^(.*)/$ /$1 [R=301,L]
3. Настройка главного зеркала.
Выберите адрес, который будет основным.
Редирект на HTTPS
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}>
Решите главное зеркало без “www” или с ним:
- в консоли Яндекс.Вебмастер можно увидеть, какой адрес поисковик считает основным, добавив оба варианта;
- вычислить, каких страниц больше в индексе поиска, проведя анализ выдачи;
- для нового сайта без истории поиска разницы нет.
Переадресация с www на без www
- RewriteEngine On
- RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
- RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Переадресация с без www на www
- RewriteEngine On
- RewriteCond %{HTTP_HOST} !^www..* [NC]
- RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R=301]
4. Перенаправление между разными доменами.
Этот тип переадресации используется, чтобы помочь посетителям выйти на ваш новый адрес.
Примените один из двух вариантов кода:
- RewriteEngine On
- RewriteRule ^(.*)$ http://www.mysite2.com/$1 [R=301,L]
или
- RewriteEngine on
- RewriteCond %{HTTP_HOST} ^www.mysite1.ru$ [NC]
- RewriteRule ^(.*)$ http://www.mysite2.ru/$1 [R=301,L]
Замените «mysite1» адресом старого домена, а «mysite2» – вашего нового.
Усиление безопасности с помощью .htaccess
Файл .htaccess защитит от таких угроз, как:
- опасные скрипты;
- воровство контента;
- DOS-атаки.
5. Запрет скачивания изображений с сайта.
Чтобы пресечь воровство контента с вашего сайта посредством хотлинков, используйте такой вот код:
- Options +FollowSymlinks
- RewriteEngine On
- RewriteCond %{HTTP_REFERER} !^$
- RewriteCond %{HTTP_REFERER} !^https://(www.)?mysite.com/ [nc]
- RewriteRule .*.(gif|jpg|png)$ https://mysite.com/img/goaway.gif[nc]
Укажите свой адрес вместо «mysite.com» и добавьте изображение на адрес https://mysite.com/img/goaway.gif, которое и увидят посетители и владельцы сайта-вора.
6. Ограничение доступа.
Используя эти команды, вы можете ограничить доступ к сайту для:
- нежелательных посетителей;
- группам определенных IP-адресов;
- из определенных подсетей;
- различным вредительским ботам.
Против вредных или ненужных User Agents (ботов):
- SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
- SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
- SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
- SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
- SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR]
- SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR]
- SetEnvIfNoCase user-Agent ^Zeus [NC]
- <limit get=”” post=”” head=””>
- Order Allow,Deny
- Allow from all
- Deny from env=bad_bot
- </limit>
Список можете составить на свой вкус.
Также вы можете закрыть свой сайт от роботов-поисковиков. Например, вы можете ограничить доступ для Google при помощи таких команд:
- RewriteEngine on
- RewriteCond %{USER_AGENT} Googlebot
- RewriteRule .* - [F]
«Белый список», или ограничение для всех, кроме выбранных IP
- ErrorDocument 403 https://mysite.com
- Order deny,allow
- Deny from all
- Allow from IP1
- Allow from IP2 и т. д.
Адрес «mysite.com» нужно поменять на соответствующий вашему ресурсу, а IP1, IP2 и так далее – на разрешенные IP-адреса.
“Чёрный список”, или ограничение только для выбранных IP
- allow from all
- deny from IP1
- deny from IP2 и т. д.
Ограничение по выбранной подсети
- allow from all
- deny from 192.168.0.0/24
После «deny from» укажите маску подсети.
IP-адреса авторов комментариев видны в логах сервера или в панели администрирования.
Ограничение доступа к файлу
- <files myfile.html>
- order allow,deny
- deny from all
- </files>
Вместо «myfile.html» пишите название своего файла. При попытке получить к нему доступ будет отображаться ошибка 403.
Нужно защитить и сам .htaccess, когда закончите работу с правилами в нём. Рекомендуем установить на него “только чтение” для всех групп пользователей.
- <Files .htaccess>
- order allow,deny
- deny from all
- </Files>
Ограничение переходов с конкретных сайтов
Можно также ограничивать доступ с конкретных сайтов.
- RewriteEngine on
- RewriteCond %{HTTP_REFERER} bad-site.com [NC,OR]
- RewriteCond %{HTTP_REFERER} bad-site.com [NC,OR]
- RewriteRule .* - [F]
7. Защита доступа к конкретному файлу или папке.
Создайте новый файл под названием .htasswd в корне. Впишите логины с паролями по типу «user:password». Зашифруйте пароли, используя генераторы, вроде этого. Затем вносите файлы или разделы в .htaccess:
Защита доступа к файлу
- AuthType Basic
- AuthName “”
- AuthUserFile /pub/home/.htpasswd
- Require valid-user
Защита доступа к папке
- resides
- AuthType basic
- AuthName “This directory is protected”
- AuthUserFile /pub/home/.htpasswd
- AuthGroupFile /dev/null
- Require valid-user
Укажите, начиная с корневой папки, путь к созданному файлу .htpasswd, вместо «/pub/home/.htpasswd». Проверьте доступ после завершения работы.
8. Пресечение вредоносных скриптов.
От атак хакеров с помощью «скриптовых инъекций» защитят эти команды:
- Options +FollowSymLinks
- RewriteEngine On
- RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%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]
9. Предотвращение DOS-атак.
Для защиты от DOS-атак укажите максимальный лимит на размер загружаемых файлов в байтах.
- LimitRequestBody 10240000
Для полного запрета на любые загрузки, укажите значение ниже 1 МБайта. Почитайте официальную документацию, чтобы изучить команды LimitRequestFields, LimitRequestFieldSize и LimitRequestLine.
Настройка отображения сайта
10. Замена индексного файла.
Индексный файл по умолчанию открывается при обращении к тому или иному каталогу.
В структуре каталога он выглядит вот так вот:
Чтобы открывался другой файл, в этом же каталоге нужно добавить .htaccess и прописать:
- DirectoryIndex hello.html
Адрес нужного файла пропишите на месте «hello.html». Можно написать несколько файлов, тогда при недоступности первого будет загружаться второй в строке, и так далее, по порядку.
- DirectoryIndex hello.html hello.php hello.pl
11. Добавление или удаление html в конце адреса.
Удалять или нет расширение в конце адреса – дело вкуса.
Добавление расширения:
- RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|?)
- RewriteRule .* %1.html [R=301,L]
- RewriteRule ^(.*)/$ /$1.html [R=301,L]
Удаление расширения:
- RewriteBase /
- RewriteRule (.*).html$ $1 [R=301,L]
Точно также удаляется или добавляется .php.
12. Настройка кодирования.
Необходимо передавать браузерам, какая кодировка используется для сайта, чтобы они корректно отображали его содержимое.
С помощью .htaccess можно задать кодировку, если она ещё не задана у каждой страницы сайта в метатеге.
В пределах одного ресурса кодировки должны совпадать во всех подобных командах для правильной работы сайта.
Эта команда устанавливает для всех файлов UTF-8:
- AddDefaultCharset UTF-8
А эта директива преобразует в Windows-1251 все файлы, которые будут загружены на сервер:
CharsetSourceEnc WINDOWS-1251
13. Создание персонализированных страниц ошибок.
Команды в .htaccess позволяют отображать специально созданные страницы ошибок вместо стандартных. Прежде чем писать их, нужно в корневую папку поместить подпапку с названием «error» и загрузить в неё для каждой страницы с сообщением об ошибке соответствующий файл.
- ErrorDocument 401 /error/401.php
- ErrorDocument 403 /error/403.php
- ErrorDocument 404 /error/404.php
- ErrorDocument 500 /error/500.php
С кастомной страницей пользователь сможет пройти по указанным вами ссылкам на работающие разделы вашего ресурса.
Оптимизация функционирования сайта.
Вы можете сделать загрузку быстрее с помощью .htaccess, используя кэширование и/или сжатие компонентов.
14. Сжатие компонентов сайта.
Сжатые файлы ускоряют загрузку, но сильнее нагружают сервер. Используйте один из модулей:
- mod_zip. Подходит для работы с масками.
- mod_deflate. В нем сжимаемые типы файлов нужно перечислять.
Модуль Gzip:
- 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.*
Модуль mod_deflate:
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
15. Усиленное кэширование.
При повторном посещении кэшированный контент ускоряет загрузку ресурса.
- FileETag MTime Size
- <ifmodule mod_expires.c>
- <filesmatch “.(jpg|gif|png|css|js)$”>
- ExpiresActive on
- ExpiresDefault “access plus 1 week”
- </filesmatch>
- </ifmodule>
Вместо «1 week» вы можете указать любую подходящую вам единицу измерения времени и в любом количестве.
- 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"
Кэшируются такие виды контента, как:
- image/x-icon;
- image/jpeg;
- image/png;
- image/gif;
- application/x-shockwave-flash;
- text/css;
- text/javascript;
- application/javascript;
- application/x-javascript;
- text/html;
- application/xhtml+xml.
Дополнительные возможности
16. Контроль настроек php.
Если программисты доступом непосредственно к файлу php.ini не располагают, то они могут работать с настройками php через .htaccess.
- php_value upload_max_filesize 125M
- php_value post_max_size 20M
- php_value max_execution_time 60
Что эти строки, собственно, означают:
- «upload_max_filesize» – это лимит в мегабайтах для загружаемых файлов;
- «post_max_size» – это лимит для объема постинга;
- «max_execution_time» – предельное время на обработку скриптов, указанное в секундах.
17. Борьба со спам-комментариями через WordPress.
Чтобы спамеры не могли добраться до файла wp-comments-post.php, используйте следующие команды:
- RewriteEngine On
- RewriteCond %{REQUEST_METHOD} POST
- RewriteCond %{REQUEST_URI} .wp-comments-post.php*
- RewriteCond %{HTTP_REFERER} !.*mysite.com.* [OR]
- RewriteCond %{HTTP_USER_AGENT} ^$
- RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
18. Установка электронной почты для администрации.
Сообщения обо всех важных событиях на сервере будут идти на один конкретный адрес электронной почты.
- ServerSignature EMail
- SetEnv SERVER_ADMIN Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
19. Предупреждения о недоступности по техническим причинам
Иногда возникают непредвиденные обстоятельства и сайт оказывается по каким-либо техническим причинам. Замените своим адресом IP-адрес из нашего примера кода, а адрес страницы с сообщением о работах впишите в последнюю строку.
- RewriteEngine on
- RewriteCond %{REQUEST_URI} !/info.html$
- RewriteCond %{REMOTE_HOST} !^12.345.678.90
- RewriteRule $ https://mysite.ru/info.html [R=302,L]
Памятка по принципам работы с файлом .htaccess
- Перед любыми изменениями, чтобы была возможность «откате» – делайте копию файла;
- Вносите изменения по одному и проверяйте, как работает сайт, прежде чем вносить следующее;
- При создании нескольких копий .htaccess в разных каталогах, версия в дочернем подразделе унаследует директивы от версии в родительском или в корне. В дочерней версии нужно ввести только новые команды, предназначенные для этого каталога.
- Не забывайте чистить кэш браузера! Горячие клавиши: Ctrl+F5 (или Ctrl+R в Safari, или Cmd+R в Mac OS);
- Ошибка 500 означает, что нужно проверить синтаксис в .htaccess на наличие опечаток, в чем могут помочь онлайновые сервисы, вроде этого. При отсутствии ошибок следует обращаться к программисту и хостинг-провайдеру, потому что дело тогда в главном файле конфигурации, запрещающем такой тип команд;
- Кириллица неприменима в .htaccess. Для кириллических доменов используйте метод написания punycode, который вы можете узнать через whois-сервис.;
- Используйте этот файл, только если нет более простого способа решения той же задачи, потому что перегрузка его командами пагубно влияет на работоспособность.