В этой статье мы рассмотрим тему .htaccess: как создать этот конфигурационный файл, для чего он нужен и как с его помощью управлять редиректами, правами доступа и другими настройками.
Что такое файл .htaccess
.htaccess — это дополнительный конфигурационный (служебный) файл, с помощью которого можно управлять настройками сервера. Он применяется в том случае, если хостинг-провайдер использует программное обеспечение Apache.
Файл .htaccess будет полезен, если ваш сайт размещен на виртуальном хостинге. На нём несколько пользователей делят ресурсы одного сервера. Общие настройки для управления этим сервером закрыты от клиентов, чтобы у них не было возможности влиять на другие сайты. При этом пользователи могут управлять настройками сервера только в рамках своего сайта через создание .htaccess.
Зачем нужен .htaccess
В файле .htaccess можно задать некоторые серверные настройки Apache для конкретного сайта или отдельной папки. Например:
- Починить кодировку. От кодировки (Charset) зависит способ отображения кода в виде печатных символов. К наиболее распространенным кодировкам относятся UTF-8 и Windows-1251. Если тексты на сайте превратились в набор непонятных знаков — значит, на сайте слетела кодировка. Исправить её можно в .htaccess.
- Настроить редирект. Редирект — это переадресация с одного адреса на другой. Подробнее о назначении редиректов, их типах и настройках мы рассказали в статье. Файл .htaccess позволяет задавать гибкие перенаправления: например, для отдельного IP, со страниц без префикса www на страницы с ним, редиректы для всех страниц, кроме главной и другие.
- Назначить страницы ошибок. На сайтах встречаются различные ошибки (404 — страница не найдена, 403 — в доступе отказано и т. д.). Тогда пользователь видит страницу с описанием возникшей ошибки. По умолчанию такие страницы практически не оформлены и могут сильно отличаться от дизайна остального сайта. Выход — создать свою красочную страницу ошибки и задать ее появление в .htaccess.
- Изменить главную страницу. В архитектуре сайта по умолчанию выбрана главная страница (индексный файл), которая отображается первой при открытии сайта. Если вы хотите сделать первой какую-то другую страницу, используйте .htaccess.
- Включить кэширование файлов. Кэширование позволяет поместить часть статичной информации сайта в кэш. Благодаря этому страницы сайта будут быстрее загружаться в браузерах пользователей. Если настроить кэширование в .htaccess, ускорится работа сайта.
- Создать ЧПУ. ЧПУ расшифровывается как «человекопонятный URL». Иногда URL-адреса могут быть слишком длинными или содержать численное обозначение страниц. Это негативно влияет на пользовательский фактор, а значит и на SEO-показатели. В .htaccess с помощью одной команды можно назначить для URL латинские символы (или задать другой подходящий способ).
- Защитить папку паролем. Если сайт содержит папку с конфиденциальной информацией, ей требуется дополнительная защита. Через .htaccess можно настроить базовую аутентификацию по логину и паролю. Это позволит снизить риск взлома и кражи данных.
- Настроить параметры php. PHP — язык программирования, который используется в разработке большинства сайтов с динамическим контентом. Настраивать PHP можно в файле php.ini, а можно работать с ним как с модулем .htaccess и управлять настройками в одном конфигурационном файле.
- Ограничить доступ к сайту. В .htaccess можно ограничить доступ к сайту для нежелательных IP, что позволит контролировать доступ, а также отражать хакерские атаки. Например, DDoS-атаку, в момент которой процессор пытаются нагрузить таким количеством запросов, которые он не способен обработать. Как правило, запросы поступают с одного/нескольких IP-адресов. Подробнее: Что такое DDoS-атака.
- Закрыть доступ к сайту от поисковых ботов. Чтобы сайт отображался в поисковой выдаче, его должны обойти поисковые роботы, которые собирают информацию, необходимую для индексации. Однако некоторые поисковые боты могут быть нежелательны (SolomonoBot и др.). В .htaccess можно ограничить доступ к сайту для нежелательных ботов по User-Agent.
Таким образом, .htaccess позволяет гибко настраивать отдельные сайты без изменения общих параметров сервера. Также этот конфигурационный файл можно передавать внештатным SEO-специалистам: они получат доступ к настройками именно SEO-оптимизации без возможности менять настройки на сайте или хостинге.
Ниже рассмотрим, как создать файл .htaccess на своем компьютере и загрузить его на хостинг.
Как сделать .htaccess в Windows
Если ваш сайт создан с помощью CMS (WordPress, Joomla, 1С Битрикс и других), файл .htaccess будет сгенерирован автоматически. Вы сможете его найти в корневой папке сайта в панели управления хостингом. Как правило, по умолчанию в файле не будет никакой информации, кроме нескольких строк с комментариями.
Обратите внимание! На хостинге с панелью управления cPanel .htaccess и все другие файлы, которые начинаются с точки, по умолчанию скрыты. Чтобы он начал отображаться в корневой папке, следуйте инструкции.
Если же сайт был написан с нуля, а не на CMS, или если файл по какой-то причине был удален, вы можете создать его на компьютере. Чтобы создать файл .htaccess на компьютере с ОС Windows:
-
1.
Откройте программу Блокнот.
-
2.
Нажмите Файл → Сохранить как (или используйте комбинацию горячих клавиш Ctrl + Shift + S):
-
3.
В графе «Тип файла» выберите Все файлы. Затем в поле «Имя файла» введите «.htaccess» и нажмите Сохранить:
Если файл сохранился под названием .htaccess.txt, нужно убрать расширение текстовых файлов (.txt). Для этого откройте проводник, перейдите во вкладку Вид и уберите галочку напротив пункта «Расширения имен файлов»:
Интерфейс проводника в Windows 10
Когда файл будет готов, залейте его в корневую папку сайта. Для этого войдите в панель управления и следуйте подходящей инструкции:
-
1.
Перейдите в раздел Менеджер файлов → www и выберите домен вашего сайта.
-
2.
Нажмите кнопку Загрузить в панели иконок сверху.
-
3.
Нажмите Выберите файл, найдите на локальном диске созданный файл .htaccess и кликните Ok:
Готово, файл добавлен в «корень» сайта.
Обратите внимание: если вид вашей панели управления отличается от представленного в статье, в разделе «Основная информация» переключите тему с paper_lantern на jupiter.
-
1.
В блоке «Файлы» нажмите Менеджер файлов:
-
2.
Найдите в списке слева корневую папку вашего сайта, кликните по нему и в строке сверху нажмите Загрузить:
-
3.
В открывшемся окне нажмите Выбрать файл и выберите файл .htaccess.
Готово, файл будет загружен.
-
1.
В блоке нужного домена выберите Менеджер файлов:
-
2.
Нажмите в верхней панели Загрузить и откройте созданный файл .htaccess.
Готово, файл будет загружен.
Работа с файлом .htaccess
Создать файл и загрузить его в корневую папку сайта — только первый шаг. Следующий и самый важный — начать работать с настройками, о которые мы описывали выше.
Все конфигурации в .htaccess задаются с помощью директив (или команд). Они включают в себя символы латинского алфавита, %, фигурные и квадратные скобки и другие. Каждая директива состоит из ключа (неизменяемая часть) и значения. Например, директива для изменения главной страницы сайта:
Где DirectoryIndex — ключ, а index.php — значение (страница, которую вы хотите использовать в качестве главной страницы сайта).
Чтобы внести какую-либо директиву в конфигурационный файл вашего сайта:
-
1.
Откройте файл .htaccess в корневой папке. Или создайте новый, если директива должна применяться не ко всему сайту, а к конкретному файлу или папке.
-
2.
Скопируйте нужную директиву и вставьте ее в файл.
-
3.
Замените значение для вашего сайта (нужный домен, страница и т. п.).
-
4.
Сохраните изменения.
Обратите внимание! Не вносите в .htaccess видоизмененные команды, если не уверены в их работе. Повреждение файла может повлечь за собой сбой работы сайта.
Ниже вы найдете директивы для нескольких наиболее распространенных операций в файле .htaccess.
Как запретить доступ к файлу, папке или всему сайту
Когда на сайте идут «ремонтные работы», он функционирует нестабильно. Чтобы в это время на него не заходил никто, кроме разработчиков, можно ограничить доступ к сайту или отдельным файлам.
- Чтобы закрыть доступ ко всему сайту, добавьте в файл строки:
Order Deny,Allow
Deny from all
- Чтобы закрыть доступ к конкретной папке, создайте новый файл .htaccess в этой папке и добавьте в него код выше.
- Чтобы закрыть доступ от всех посетителей, кроме конкретного IP (через запятую можно указать несколько IP-адресов) введите:
Order Deny,Allow
Deny from all
Allow from 123.123.123.123
Где 123.123.123.123 — IP-адрес, для которого доступ разрешен.
- Чтобы закрыть доступ к конкретному файлу, создайте новый файл .htaccess в той папке, где находятся нужный файл, и добавьте следующие строки:
<Files example.exe>
Order Deny.Allow
Deny from all
</Files>
Где example.exe — название файла, к которому нужно закрыть доступ.
Как запретить доступ к файлам определенного типа
Если вам требуется запретить доступ к нескольким файлам одного формата, можно добавить директиву для каждого. При этом стоит учитывать, что серверу будет сложнее обрабатывать большое количество параметров в файле .htaccess. Чтобы экономить ресурсы сервера, можно закрыть доступ не к каждому файлу, а ко всем файлам схожего расширения.
Для этого добавьте следующие строки:
<Files ".(txt|pdf|jpg)$">
Order Deny.Allow
Deny from all
</Files>
Где вместо txt, pdf, jpg — нужные вам расширения.
Как запретить просмотр директорий в .htaccess
Обладая определенными знаниями, любой человек может посмотреть структуру вашего сайта (в первую очередь листинг — список всех каталогов сайта). Чтобы запретить просмотр листинга, можно ввести одну строку в .htaccess:
Чтобы открыть отображение листинга, введите:
Как настроить 301 редиректа для сайта
Мы посвятили настройке редиректов в .htaccess отдельную статью, в которой рассмотрели 10 различных вариаций редиректов.
Рассмотрим самый часто используемый тип: редирект с одного домена на другой. Он используется, если сайт переехал на новый домен из-за ребрендинга, изменения официального названия компании или причин технического характера.
Чтобы сделать редирект, добавьте в .htaccess строки:
RewriteEngine On
RewriteCond %{HTTP_HOST} site1.ru
RewriteRule (.*) http://site2.ru/$1 [R=301,L]
Где site1.ru — исходный домен, site2.ru — целевой домен.
Как включить обработку ошибок
Чтобы установить пользовательские страницы ошибок, нужно воспользоваться директивой ErrorDocument. Добавьте в .htaccess директиву с номером ошибки и адрес созданной страницы:
ErrorDocument 404
http://site.ru/error/404.html
Где:
- site.ru — домен вашего сайта;
- error — папка, в которой расположена страница ошибки (если её нет, пропустите это звено);
- 404.html — название страницы ошибки.
Пример файла .htaccess
Ниже мы приводим пример «боевого» файла .htaccess c комментариями. Комментарии не отображаются в основном коде и используются для пояснений. Чтобы добавить комментарий, поставьте перед строкой шарп (#).
# Закрыт доступ к просмотру листинга (списка директорий) сайта:<head> </head>
# Задана пользовательская страница для ошибки 404:<head> </head>
ErrorDocument 404 /404.php
<IfModule mod_php5.c>
# Настройка параметров php для версии 7.x:<head> </head>
<IfModule mod_php7.c>
php_flag session.use_trans_sid off
#php_flag default_charset UTF-8
#php_value display_errors 1
</IfModule>
# Настройка ЧПУ для 1С-Битрикс:<head> </head>
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
</IfModule>
# Указание индексного файла:<head> </head>
<IfModule mod_dir.c>
DirectoryIndex index.php index.html
</IfModule>
# Включение модуля mod_expires и выставление настроек времени кэширования статических файлов:<head> </head>
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/jpeg "access plus 3 day"
ExpiresByType image/gif "access plus 3 day"
ExpiresByType image/png "access plus 3 day"
ExpiresByType text/css "access plus 3 day"
ExpiresByType application/javascript "access plus 3 day"
</IfModule>
Итак, мы рассмотрели создание .htaccess (Windows), а также часто используемые директивы, которые нужны для управления сайтом. По инструкциям вы сможете выставить нужные настройки.
Время на прочтение
14 мин
Количество просмотров 87K
Спорим, о некоторых вы не подозревали. Мы собрали варианты применения .htaccess для улучшения работы сайта. Он часто используется оптимизаторами для корректной настройки 301 редиректов. Но этим возможности файла не ограничиваются. Тут и безопасность, и оптимизация, и параметры отображения — с помощью .htaccess вебмастер может сделать много полезного, чтобы сайт работал корректно.
Файл .htaccess (сокращение от «hypertext access») переопределяет настройки самого популярного типа веб-серверов Apache и его аналогов. Ниже — способы применения .htaccess для разных целей с примерами кода.
Зачем нужен .htaccess и где его искать
Файл нужен для более гибкой настройки сервера под задачи оптимизатора. Задавать правила в .htaccess не стоит, если у вас есть доступ к главному конфигурационному файлу сервера .httpd.conf или apache.conf (название зависит от настроек операционной системы). Изменения в нем вступают в силу быстрее, запросы не перегружают сервер. Однако очень часто такого доступа нет, например, в случае с виртуальным хостингом. Тогда приходится прописывать нужные настройки через .htaccess.
Возможности .htaccess для оптимизации сайта:
- Настройка редиректов для SEO.
- Обеспечение безопасности ресурса в целом и отдельных разделов.
- Настройка корректного отображения сайта.
- Оптимизация скорости загрузки.
Где искать и как редактировать
Если файл .htaccess находится в корневой папке, действие команд распространяется на весь сайт, но разместить его можно в любой каталог. Тогда директивы будут касаться только конкретного каталога и подкаталогов. Таким образом, на ресурсе может быть несколько файлов .htaccess. Приоритет имеют команды файла, расположенного в каталоге, а не в корне.
.htaccess — общепринятое и самое популярное название, но не обязательное (оно задается в файле httpd.conf). Несмотря на непривычное название, создавать и редактировать файл можно в любом текстовом редакторе.
Некоторые CMS дают возможность редактировать файл через административную панель. В Битриксе его легко можно найти в разделе Контент — Файлы и папки:
В WordPress редактировать .htaccess можно с помощью модулей плагинов Yoast SEO и All in One SEO Pack.
Если файл .htaccess отсутствует, создайте его в текстовом редакторе и разместите в корневой папке сайта или в нужном каталоге (потребуется доступ к хостингу или по ftp).
Синтаксис .htaccess
Синтаксис файла простой: каждая директива (команда) начинается с новой строки, после знака # можно добавлять комментарии, которые не будут учитываться сервером. Изменения на сайте вступают в силу сразу, перезагрузка сервера не требуется.
Правила задаются в том числе при помощи регулярных выражений. Для того, чтобы их прочитать, нужно понимать значение спецсимволов и переменных. Расшифруем самые часто используемые.
Основные спецсимволы:
- ^ — начало строки;
- $ — конец строки;
- . — любой символ;
- * — любое количество любых символов;
- ? — один определенный символ;
- [0-9] — последовательность символов, например, от 0 до 9;
- | — символ «или», выбирается или одна группа, или другая;
- () — иcпользуется для выбора групп символов.
Основные переменные:
- %{HTTP_USER_AGENT} — поле User-Agent, которое передает браузер пользователя;
- %{REMOTE_ADDR} — IP адрес пользователя;
- %{REQUEST_URI} — запрашиваемый URI;
- %{QUERY_STRING} — параметры запроса после знака ?.
Для тех, кто хочет основательно погрузиться в тему, — полная официальная документация по использованию .htaccess или хороший ресурс на русском. А мы пройдемся по основным возможностям файла для оптимизации вашего сайта.
Настраиваем редиректы для SEO
Как мы уже упоминали, это самый популярный способ использования .htaccess. Перед тем, как настраивать тот или иной вид переадресации, убедитесь, что это действительно необходимо. Например, редирект на страницы со слешем в некоторых CMS настроен по умолчанию. О настройках редиректа для SEO мы писали в блоге.
При настройке 301 редиректов помните о двух правилах:
- Избегайте нескольких последовательных перенаправлений — они увеличивают нагрузку на сервер и снижают скорость работы сайта.
- Располагайте редиректы от частных к глобальным. Например, сначала переадресация с одной страницы на другую, затем общий редирект на страницы со слешем. Это правило работает не в 100% случаев, поэтому с размещением директив нужно экспериментировать.
1. Настраиваем постраничные 301 редиректы
Это потребуется в следующих случаях:
- изменилась структура сайта и у страницы поменялся уровень вложенности;
- страница перестала существовать, но нужно сохранить ее входящий трафик (например, в случае отсутствия товара обычно делают переадресацию на товарную категорию);
- поменялся URL, что крайне нежелательно, но тоже встречается.
Просто удалить страницу — плохая идея, лучше не отдавать роботу ошибку 404, а перенаправить его на другой 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. Избавляемся от дублей
Каждая страница сайта должна быть доступна только по одному адресу. Для этого должны быть настроены:
- редирект на страницы со слешем в конце URL или наоборот;
- главное зеркало — основной адрес сайта в поиске.
Сделать это можно при помощи модуля mod_rewrite
. В его составе используются специальные команды — директивы сложного перенаправления. Первой командой всегда идет включение преобразования URL:
RewriteEngine On
Переадресация на слеш или наоборот
Настроить ли переадресацию на страницы со слешем или без, в каждом случае нужно решать индивидуально. Если у сайта уже накоплена история в поиске, анализируйте, каких страниц в индексе больше. Для новых сайтов обычно настраивают редирект на слеш. Проверить, не настроена ли переадресация по умолчанию, просто: удалите/добавьте слеш в конце URL. Если страница перезагрузится с новым адресом — мы имеем дубли, требуется настройка. Если URL подменяется — все в порядке. Проверять лучше несколько уровней вложенности.
Код 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. Настраиваем главное зеркало
Для начала нужно определиться, какой адрес будет являться основным для поиска. SSL-сертификат давно уже мастхэв. Просто установите его и добавьте правило в .htaccess. Не забудьте также прописать его в robots.txt.
Редирект на HTTPS
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Определять, с «www» или без будет главное зеркало, можно несколькими способами:
- добавить сайт в Яндекс.Вебмастер в двух вариантах, в консоли отобразится информация, какой URL поисковик считает главным зеркалом;
- проанализировать выдачу и посмотреть, каких страниц сайта больше в индексе;
- для нового ресурса не имеет значения, с «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. Перенаправляем с одного домена на другой
Самая очевидная причина настройки этого редиректа — переадресовать роботов и пользователей на другой адрес при переезде сайта на новый домен. Также им пользуются оптимизаторы для манипуляций ссылочной массой, но дроп-домены и PBN — серые технологии продвижения, которые в рамках этого материала мы затрагивать не будем.
Воспользуйтесь одним из вариантов кода:
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» на старый и новый домен соответственно.
Модуль SEO в системе Promopult: для тех, кто не хочет тонуть в рутине. Все инструменты для улучшения качества сайта и поискового продвижения, автоматизация процессов, чек-листы, подробные отчеты.
Обеспечиваем безопасность сайта
Файл .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-адресов, подсетей, а также вредоносным ботам можно запретить доступ на ваш ресурс при помощи следующих директив в .htaccess.
Для нежелательных 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>
Список юзер-агентов можно дополнять, сокращать или создать свой. Перечень хороших и плохих ботов можно посмотреть здесь.
Частный случай такого запрета — запрет для поисковых роботов. Если вас почему-то не устраивает правило в robots.txt, можно запретить доступ, например, роботу 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 и т. д.
Не забываем заменить «https://mysite.com» на адрес вашего сайта и вписать IP-адреса вместо IP1, IP2 и т.д.
Для определенных IP-адресов
allow from all
deny from IP1
deny from IP2 и т. д.
Для подсети
allow from all
deny from 192.168.0.0/24
Вписываем маску сети в строку после «deny from».
Спамные IP-адреса можно вычислить в логах сервера или с помощью сервисов статистики. В административной панели WordPress отображаются IP-адреса комментаторов:
К определенному файлу
<files myfile.html>
order allow,deny
deny from all
</files>
Вписываем название файла вместо «myfile.html» в примере. Пользователю будет показана ошибка 403 — «доступ запрещен».
Не лишним будет ограничить доступ к самому файлу .htaccess из соображений безопасности, а также рекомендуем после настройки всех правил поставить на файл права доступа 444.
<Files .htaccess>
order allow,deny
deny from all
</Files>
Для сайтов на WordPress важно ограничить доступ к файлу wp-config.php, т.к. в нем содержится информация о базе данных:
<files wp-config.php>
order allow,deny
deny from all
</files>
Для пользователей, пришедших с определенного сайта
Вы можете заблокировать посетителей с нежелательных ресурсов (например, со взрослым или шокирующим контентом).
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} bad-site.com [NC,OR]
RewriteCond %{HTTP_REFERER} bad-site.com [NC,OR]
RewriteRule .* - [F]
</ifModule>
7. Защищаем доступ к определенному файлу или папке
Для начала создайте файл .htpasswd, пропишите в нем логины и пароли в формате user:password и разместите в корне сайта. В целях безопасности пароли лучше зашифровать. Это можно сделать при помощи специальных сервисов генерации записей, например, такого. Следующим шагом добавьте директории или файлы в .htaccess:
Защита паролем файла
<files secure.php=””>
AuthType Basic
AuthName “”
AuthUserFile /pub/home/.htpasswd
Require valid-user
</files>
Защита паролем папки
resides
AuthType basic
AuthName “This directory is protected”
AuthUserFile /pub/home/.htpasswd
AuthGroupFile /dev/null
Require valid-user
Вместо «/pub/home/.htpasswd» укажите путь до файла .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]
Все попытки причинить вред вашему ресурсу будут перенаправлены на страницу ошибки 403 «доступ запрещен».
9. Защищаем сайт от DOS-атак
Один из способов защиты — ограничить максимально допустимый размер запроса (ограничение отсутствует по умолчанию).
Для этого прописываем в .htaccess размер загружаемых файлов в байтах:
LimitRequestBody 10240000
В примере указан размер 10 Мбайт. Если вы хотите запретить загрузку файлов, пропишите число меньше 1 Мбайт (1048576 байт).
Также можно изучить возможности директив LimitRequestFields, LimitRequestFieldSize и LimitRequestLine в официальной документации.
Настраиваем отображение сайта
Посмотрим, что можно сделать с отображением всего ресурса или его разделов в браузерах пользователей при помощи .htaccess.
10. Заменяем индексный файл
Индексный файл — тот, что открывается по умолчанию при обращении к определенному каталогу. Обычно они называются: index.html, index.htm, index.php, index.phtml, index.shtml, default.htm, default.html.
Вот как это выглядит в структуре каталога:
Чтобы заменить этот файл на любой другой, размещаете в каталоге .htaccess и добавляете эту команду:
DirectoryIndex hello.html
Вместо «hello.html» вписывайте адрес желаемого файла.
Можно задать последовательность файлов, которые будут открываться в указанном порядке, если один из них будет недоступен:
DirectoryIndex hello.html hello.php hello.pl
11. Добавляем или убираем html в конце URL
Сохранять или убирать расширение файлов в URL — дело вкуса каждого оптимизатора. Достоверных исследований влияния расширений в адресах на ранжирование ресурса нет, но каждый вебмастер имеет свое мнение по этому поводу.
Чтобы добавить .html:
RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|?)
RewriteRule .* %1.html [R=301,L]
RewriteRule ^(.*)/$ /$1.html [R=301,L]
Чтобы убрать .html:
RewriteBase /
RewriteRule (.*).html$ $1 [R=301,L]
Этими же директивами можно добавить/убрать расширение php.
12. Настраиваем кодировку
Чтобы избежать ошибок в отображении ресурса браузером, нужно сообщить ему, в какой кодировке создан сайт. Самые популярные:
- UTF-8 — универсальная
- Windows-1251 — кириллица
- Windows-1250 — для Центральной Европы
- Windows-1252 — для Западной Европы
- KOI8-R — кириллица (КОИ8-Р)
Чаще всего используют UTF-8 и Windows-1251.
Если кодировка не указана в метатеге каждой страницы, можно задать ее через .htaccess.
Пример директивы, которая задает для файла кодировку UTF-8:
AddDefaultCharset UTF-8
А такая команда означает, что все загружаемые на сервер файлы будут преобразованы в Windows-1251:
CharsetSourceEnc WINDOWS-1251
В примерах приведены разные кодировки, но в рамках одного сайта кодировки в этих директивах должны совпадать.
13. Создаем кастомные страницы ошибок
При помощи правил в .htaccess можно настроить отображение специально созданных страниц для самых популярных ошибок, например:
ErrorDocument 401 /error/401.php
ErrorDocument 403 /error/403.php
ErrorDocument 404 /error/404.php
ErrorDocument 500 /error/500.php
Перед тем, как прописывать директивы, создайте в корне сайта папку error и разместите туда соответствующие файлы для страниц ошибок.
Зачем это нужно? Например, чтобы не потерять пользователя на странице 404, а дать ему возможность перейти в другие разделы сайта:
Оптимизируем работу сайта
Скорость загрузки сайта — один из факторов ранжирования в поисковых системах. Увеличить ее можно в том числе с помощью директив в .htaccess.
14. Сжимаем компоненты сайта при помощи mod_gzip или mod_deflate
Сжатие файлов, с одной стороны, увеличивает скорость загрузки сайта, но с другой — больше нагружает сервер. В .htaccess можно включить сжатие при помощи двух модулей — mod_zip и mod_deflate. Они практически идентичны по качеству сжатия.
Синтаксис модуля Gzip более гибкий и он умеет работать с масками:
<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>
В mod_deflate вы перечисляете типы файлов, которые нужно сжать:
<ifModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
</ifModule>
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»), вы можете указать свой срок в месяцах (month), годах (year), часах (hours) и т.д.
Другой вариант кода:
<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>
Для кэширования доступны следующие типы файлов:
- 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_value, которые отвечают за объем загружаемых на сайт данных и время обработки скриптов, т.к. это напрямую влияет на производительность.
<ifModule mod_php.c>
php_value upload_max_filesize 125M
php_value post_max_size 20M
php_value max_execution_time 60
</ifModule>
В строке «upload_max_filesize» указываете максимальный размер загружаемых файлов в мегабайтах, «post_max_size» означает максимальный объем постинга, «max_execution_time» указывает время в секундах на обработку скриптов.
17. Боремся со спам-комментариями на WordPress
Для того, чтобы перекрыть доступ спамерам к файлу wp-comments-post.php, добавьте эти директивы в .htaccess:
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]
Вместо «mysite.com» впишите адрес вашего сайта.
18. Устанавливаем e-mail для администратора сервера
Этот код в .htaccess установит e-mail администратора по умолчанию. На него будут приходить уведомления, связанные с важными событиями на сервере.
ServerSignature EMail
SetEnv SERVER_ADMIN admin@mysite.com
19. Предупреждаем о недоступности сайта
В ситуации, когда сайт недоступен по техническим причинам, можно перенаправить пользователей на страницу с информацией о том, когда работа будет восстановлена. Лучше избегать таких перерывов, но в форс-мажорных обстоятельствах добавляйте следующие директивы в .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_URI} !/info.html$
RewriteCond %{REMOTE_HOST} !^12.345.678.90
RewriteRule $ https://mysite.ru/info.html [R=302,L]
IP-адрес в примере (12.345.678.90) замените на свой, в последней строке укажите адрес страницы вашего ресурса с информацией о характере и сроках завершения работ.
Общие правила работы с .htaccess
- Всегда делайте резервную копию файла перед внесением изменений, чтобы оперативно «откатить» их.
- Вносите изменения пошагово, добавляйте по одному правилу и оценивайте, как оно сработало.
- Если размещаете несколько файлов .htaccess в разных каталогах, прописывайте в дочерних только новые директивы, которые актуальны для конкретного каталога, остальные унаследуются от родительского каталога или файла в корневой папке.
- Очищайте кэш браузера: Ctrl + F5, в Safari: Ctrl + R, в Mac OS: Cmd + R.
- Если возникает ошибка 500, проверьте синтаксис правила (нет ли опечатки). Можно воспользоваться сервисами проверки файла .htaccess онлайн, например таким. Если ошибок не найдено, значит в главном конфигурационном файле такой тип директивы запрещен, придется обратиться за консультацией к программисту и хостинг-провайдеру.
- В директивах .htaccess кириллические символы не допускаются. Если необходимо указать адрес кириллического домена (мойсайт.рф), воспользуйтесь любым whois-сервисом, чтобы узнать его написание по методу punycode. Например, адрес «сайт.рф» будет выглядеть как «xn--80aswg.xn--p1ai/$1».
- Слишком большое количество директив в .htaccess может снизить работоспособность сайта. Старайтесь использовать файл только в том случае, если другим путем задачу решить нельзя.
- Если нет времени подробно изучать особенности директив, воспользуйтесь генератором .htaccess.
Файл .htaccess являются по своему назначению конфигурационным файлом уровня каталога(директории) для web сервера Apache. Это означает, что директивы из этого файла исполняются Apache локально только при обращении к директории, содержащий этот файл. Область действия этих директив распространяется только на каталог, в котором расположен файл, и на вложенные каталоги, до тех пор пока они не будут переопределены в других файлах .htaccess из вложенных каталогов. Файл.htaccess перечитывается при каждом обращении к веб-серверу, так что изменения, внесенные в этот файл, вступают в силу немедленно.
Таки образом apache предоставляет нам удобный инструмент конфигурации на уровне директорий сайта. Это расширяет наши возможности так как не все настройки удобно делать на глобальному уровне и на уровне виртуального хоста. Так же на хостингах, владелец сайта, как правило, не имеет возможности выполнять настройки apache на глобальном уровне и на уровне виртуального хоста, но у него может быть возможность задать требуемые настройки на уровне каталогов сайта. Для того что бы apache принимал и исполнял директивы из файлов .htaccess каталогов сайта нужно, что бы на глобальном уровне или на уровне виртуального хоста apache это было разрешено для сайта.
Делается это разрешение при помощи следующего блока кода:
<Directory /home/my_site/www> AllowOverride All #Другие директивы ... </Directory>
Здесь в теге <Directory> указывается физический путь на сервере до корня вашего сайта, и внутри тега указывается директива AllowOverride. Эта директива может быть установлена в None, чтобы сервер не читал файл .htaccess. Если она установлена в All — сервер будет допускать все директивы .htaccess файла. Значение по умолчанию: AllowOverride All.
Теперь пару слов о названии файла .htaccess. Этот файл может называться и по другому, и это тоже устанавливается в глобальном конфиге apache директивой AccessFileName. По умолчанию эта директива установлена в конфиге как AccessFileName .htaccess, и это значение обычно никто не меняет, но вы должны знать, что изменить его на другое возможно.
Синтаксис файлов .htaccess в общем случае аналогичен синтаксису главного файла конфигурации apache. Однако, администратор может ограничивать для пользователей доступ к тем или иным директивам. То есть, несмотря на то, что команда, в принципе, может исполняться из .htaccess, администратор может запретить доступ к конкретной директиве. Учитывайте это при работе. Также хочу заметить такой момент, когда вы пишите директивы работающие с каталогами? то в главных конфигурационных файлах apache их нужно оборачивать в тег <Directory /path/…> с указанием каталога к которому они применимы, однако при написании этих директив в .htaccess файле уже не нужно их оборачивать в тег <Directory>, если вы хотите что бы они применялись к текущему каталогу файла .htaccess, если же вы хотите применить их только к вложенному каталогу то тогда, опять же, нужно обернуть в тег <Directory>.
Для чего мы можем использовать .htaccess файл. Вариантов здесь немало, вот самые распространенные из них:
1.Для управления разрешениями на доступы к каталогам сайта (запаролить директорию, запретить доступ к файлам определенного формата, или доступ к сайту в определенный промежуток времени, запретить или открыть доступ с определенных IP адресов, управлять роботами поисковиков)
2.Для перезаписи текущего URL на новый в зависимости от условий (см. также описание mod_rewrite сервера Apache и логику его обработки правил )
3.Для явного указания кодировки сайта.
4.Для разрешения или запрета просмотра файлов сайта
5.Для защиты от хотлинка
6.Для выполнения ридирктов
7.Для задания своих страниц ошибок
8.Для переопределения индексного файла
9…. и многое другое.
Давайте для примера напишем некий обобщенный файл .htaccess.
В него мы соберем наиболее распространенные случаи использования директив и добавим к ним комментарии. И из этого шаблона путем удаления не нужного вы сможете всегда подготовить конкретный .htaccess для ваших задач. Здесь символ # — это символ комментария применяемый в конфигах apache.
Подробные пояснения к коду шаблона см. после него.
# .htaccess начало шаблона # Установка временной зоны SetEnv TZ Europe/Moscow # Установим принудительно кодировку страниц сайта AddDefaultCharset UTF-8 # Зададим index файл который будет # отдаваться если запрошенный не найден DirectoryIndex index.php index.html # Запретим пользователям просматривать файлы директории Options -Indexes # Разрешим следовать за символическими связями в этом каталоге Options +FollowSymLinks # Разрешение доступа только для указанных IP Order Deny,Allow Deny from all Allow from x.x.x.x # Или запрет доступа по IP Order allow,deny deny from x.x.x.x deny from x.x.x.x allow from all # Запретить всем, то только # одну эту строку указать Deny from all # Закрыть доступ к вложенной директории относительно текущего файла # можно так, или положив туда отдельный .htaccess файл <Directory /passwds/> Order Deny,Allow Deny from All </Directory> # Закрыть директорию паролем AuthType Basic AuthName "Enter a password" #путь до файла с паролями и пользователями AuthUserFile /full/path/to/.htpasswd require valid-user # или закрыть вложенную директорию паролем <Directory /passwds/> AuthType Basic AuthName "Enter a password" #путь до файла с паролями и пользователями (абсолютный или относительно ServerRoot) AuthUserFile /full/path/to/.htpasswd require valid-user </Directory> # Запрет на доступ для файла .htpasswd # для всех посетителей кроме разрешенных IP <Files ".htpasswd"> Order Deny,Allow Deny from all Allow from x.x.x.x, x.x.x.xx </Files> # Блок если нужно отключить обработку PHP # можно и для <Directory> задать <IfModule mod_php5.c> php_value engine off </IfModule> <IfModule mod_php4.c> php_value engine off </IfModule> # # Блок изменение настроек PHP # некоторые директивы зависят от версии PHP #php_flag register_globals off #php_value memory_limit 16M #for files uploading - if needed #php_value max_execution_time 500 #php_value max_input_time 500 #php_value upload_max_filesize 30M #php_value post_max_size 30M #php_flag display_errors off #Настройка PHP для загрузки больших файлов до 256M php_value memory_limit 256M php_value upload_max_filesize 256M php_value post_max_size 256M # # Перезапись URL <IfModule mod_rewrite.c> RewriteEngine On # установить корневой URL как / RewriteBase / #Все запросы с HTTP на HTTPS RewriteCond %{HTTPS} =off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L] #Только для указанных каталогов все запросы с http на https redirect RewriteCond %{HTTPS} =off RewriteCond %{REQUEST_URI} /(admin|secret)/ [NC] RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L] # 301 Редирект как принудительная #постановка замыкающего слеша #RewriteCond %{REQUEST_URI} /+[^.]+$ #RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L] # # 301 Редирект c www.site.ru на site.ru # как удаление www RewriteCond %{HTTP_HOST} ^www.site.ru [NC] RewriteRule ^(.*)$ http://site.ru/$1 [R=301,QSA,L] # #301 Универсальный редирект с домена www. на без www. RewriteCond %{HTTP_HOST} ^www.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L] #301 Универсальный редирект с домена без www. на www. RewriteCond %{HTTP_HOST} ^(.*)$ [NC] RewriteCond %{HTTP_HOST} !^www. [NC] RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L] # 301 Редирект с указанных доменов на основной RewriteCond %{HTTP_HOST} ^www.domen.net$ [NC,OR] RewriteCond %{HTTP_HOST} ^domain.net$ [NC,OR] RewriteCond %{HTTP_HOST} ^www.domain.net$ [NC] RewriteRule ^(.*)$ http://domain.net/$1 [R=301,QSA,L] # #Редирект с преобразованием GET параметров RewriteCond %{QUERY_STRING} do=page [NC] RewriteCond %{QUERY_STRING} id=(d+) [NC] RewriteRule .* /page/%1/? [R=301,L] # Внутреннее пере направление на index.php для CMS # Если запрошены не существующие файл или директория # То перенаправлять запрос на index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # # или еще вариант внутреннего пере направления на index.php RewriteCond $1 !^(index.php|images|robots.txt|public) RewriteCond %{REQUEST_URI} !.(cssіjsіjpgіgifіpng)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L,QSA] # или как: RewriteRule ^(.*)$ index.php [L] # #Еще вариант, для тех у кого не WordPress и кто хочет избавиться #от ненужных запросов (боты и т.п.) к темам, к админки и каталогам WordPress вида #где, что не файл и не директория, и не начинается с /wp-, #то делаем внутренний redirect на index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #если у вас не WordPress добавим это и также блок после этого RewriteCond %{REQUEST_URI} !^/wp- [NC] RewriteRule . /index.php [L] #если у вас не WordPress то всем кто ломиться в /wp-... #отдадим 410 Gone status - рекомендация забыть этот URL #RewriteRule "oldproduct" "-" [G,NC] #общий пример RewriteCond %{REQUEST_URI} ^/wp- [NC] RewriteRule . - [G,L] # Зашита от хотлинка RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://site.ru/ [NC] RewriteCond %{HTTP_REFERER} !^https://site.ru/ [NC] RewriteCond %{HTTP_REFERER} !^http://www.site.ru/ [NC] RewriteCond %{HTTP_REFERER} !^https://www.site.ru/ [NC] RewriteRule .(jpeg|png|bmp|gif|jpg|js|css)$ - [F] # # Еще вариант антихотлинка ресурсов (картинок) RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(.+.)?server.ru/ [NC] RewriteCond %{HTTP_REFERER} !^https://(.+.)?server.ru/ [NC] RewriteCond %{REQUEST_URI} !null.gif$ [NC] # Перенаправим на картинку заглушку dummy.gif RewriteRule .(jpg|jpeg|gif|bmp|png)$ http://server.ru/dummy.gif [L] # Еще вариант антихотлинка ресурсов (картинок) RewriteCond %{HTTP_REFERER} !^$ #Замените ?mysite.com/ на адрес вашего блога RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC] RewriteCond %{HTTP_REFERER} !^$ #Замените /images/nohotlink.jpg на ваше изображение с запрещением хотлинка RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L] # Еще вариант антихотлинка ресурсов (картинок) RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC] RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !google. [NC] RewriteCond %{HTTP_REFERER} !yandex. [NC] RewriteCond %{HTTP_REFERER} !search?q=cache [NC] RewriteCond %{HTTP_REFERER} !msn. [NC] RewriteCond %{HTTP_REFERER} !yahoo. [NC] RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpe [L] # </IfModule> # Вывод 404 ошибки если выключен mod_rewrite <IfModule !mod_rewrite.c> ErrorDocument 404 /index.php </IfModule> # Зададим свои страницы для ошибок ErrorDocument 404 /err_404.html ErrorDocument 403 /err_403.html # # Блок кода редиректа на мобильную версию сайта # Как вариант привожу здесь, больше для примера <ifModule mod_rewrite.c> RewriteEngine on # Проверить строку UserAgent браузера RewriteCond %{HTTP_USER_AGENT} acs [NC,OR] RewriteCond %{HTTP_USER_AGENT} alav [NC,OR] RewriteCond %{HTTP_USER_AGENT} alca [NC,OR] RewriteCond %{HTTP_USER_AGENT} amoi [NC,OR] RewriteCond %{HTTP_USER_AGENT} audi [NC,OR] RewriteCond %{HTTP_USER_AGENT} aste [NC,OR] RewriteCond %{HTTP_USER_AGENT} avan [NC,OR] RewriteCond %{HTTP_USER_AGENT} benq [NC,OR] RewriteCond %{HTTP_USER_AGENT} bird [NC,OR] RewriteCond %{HTTP_USER_AGENT} blac [NC,OR] RewriteCond %{HTTP_USER_AGENT} blaz [NC,OR] RewriteCond %{HTTP_USER_AGENT} brew [NC,OR] RewriteCond %{HTTP_USER_AGENT} cell [NC,OR] RewriteCond %{HTTP_USER_AGENT} cldc [NC,OR] RewriteCond %{HTTP_USER_AGENT} cmd- [NC,OR] RewriteCond %{HTTP_USER_AGENT} dang [NC,OR] RewriteCond %{HTTP_USER_AGENT} doco [NC,OR] RewriteCond %{HTTP_USER_AGENT} eric [NC,OR] RewriteCond %{HTTP_USER_AGENT} hipt [NC,OR] RewriteCond %{HTTP_USER_AGENT} inno [NC,OR] RewriteCond %{HTTP_USER_AGENT} ipaq [NC,OR] RewriteCond %{HTTP_USER_AGENT} java [NC,OR] RewriteCond %{HTTP_USER_AGENT} jigs [NC,OR] RewriteCond %{HTTP_USER_AGENT} kddi [NC,OR] RewriteCond %{HTTP_USER_AGENT} keji [NC,OR] RewriteCond %{HTTP_USER_AGENT} leno [NC,OR] RewriteCond %{HTTP_USER_AGENT} lg-c [NC,OR] RewriteCond %{HTTP_USER_AGENT} lg-d [NC,OR] RewriteCond %{HTTP_USER_AGENT} lg-g [NC,OR] RewriteCond %{HTTP_USER_AGENT} lge- [NC,OR] RewriteCond %{HTTP_USER_AGENT} maui [NC,OR] RewriteCond %{HTTP_USER_AGENT} maxo [NC,OR] RewriteCond %{HTTP_USER_AGENT} midp [NC,OR] RewriteCond %{HTTP_USER_AGENT} mits [NC,OR] RewriteCond %{HTTP_USER_AGENT} mmef [NC,OR] RewriteCond %{HTTP_USER_AGENT} mobi [NC,OR] RewriteCond %{HTTP_USER_AGENT} mot- [NC,OR] RewriteCond %{HTTP_USER_AGENT} moto [NC,OR] RewriteCond %{HTTP_USER_AGENT} mwbp [NC,OR] RewriteCond %{HTTP_USER_AGENT} nec- [NC,OR] RewriteCond %{HTTP_USER_AGENT} newt [NC,OR] RewriteCond %{HTTP_USER_AGENT} noki [NC,OR] RewriteCond %{HTTP_USER_AGENT} opwv [NC,OR] RewriteCond %{HTTP_USER_AGENT} palm [NC,OR] RewriteCond %{HTTP_USER_AGENT} pana [NC,OR] RewriteCond %{HTTP_USER_AGENT} pant [NC,OR] RewriteCond %{HTTP_USER_AGENT} pdxg [NC,OR] RewriteCond %{HTTP_USER_AGENT} phil [NC,OR] RewriteCond %{HTTP_USER_AGENT} play [NC,OR] RewriteCond %{HTTP_USER_AGENT} pluc [NC,OR] RewriteCond %{HTTP_USER_AGENT} port [NC,OR] RewriteCond %{HTTP_USER_AGENT} prox [NC,OR] RewriteCond %{HTTP_USER_AGENT} qtek [NC,OR] RewriteCond %{HTTP_USER_AGENT} qwap [NC,OR] RewriteCond %{HTTP_USER_AGENT} sage [NC,OR] RewriteCond %{HTTP_USER_AGENT} sams [NC,OR] RewriteCond %{HTTP_USER_AGENT} sany [NC,OR] RewriteCond %{HTTP_USER_AGENT} sch- [NC,OR] RewriteCond %{HTTP_USER_AGENT} sec- [NC,OR] RewriteCond %{HTTP_USER_AGENT} send [NC,OR] RewriteCond %{HTTP_USER_AGENT} seri [NC,OR] RewriteCond %{HTTP_USER_AGENT} sgh- [NC,OR] RewriteCond %{HTTP_USER_AGENT} shar [NC,OR] RewriteCond %{HTTP_USER_AGENT} sie- [NC,OR] RewriteCond %{HTTP_USER_AGENT} siem [NC,OR] RewriteCond %{HTTP_USER_AGENT} smal [NC,OR] RewriteCond %{HTTP_USER_AGENT} smar [NC,OR] RewriteCond %{HTTP_USER_AGENT} sony [NC,OR] RewriteCond %{HTTP_USER_AGENT} sph- [NC,OR] RewriteCond %{HTTP_USER_AGENT} symb [NC,OR] RewriteCond %{HTTP_USER_AGENT} t-mo [NC,OR] RewriteCond %{HTTP_USER_AGENT} teli [NC,OR] RewriteCond %{HTTP_USER_AGENT} tim- [NC,OR] RewriteCond %{HTTP_USER_AGENT} tosh [NC,OR] RewriteCond %{HTTP_USER_AGENT} tsm- [NC,OR] RewriteCond %{HTTP_USER_AGENT} upg1 [NC,OR] RewriteCond %{HTTP_USER_AGENT} upsi [NC,OR] RewriteCond %{HTTP_USER_AGENT} vk-v [NC,OR] RewriteCond %{HTTP_USER_AGENT} voda [NC,OR] RewriteCond %{HTTP_USER_AGENT} w3cs [NC,OR] RewriteCond %{HTTP_USER_AGENT} wap- [NC,OR] RewriteCond %{HTTP_USER_AGENT} wapa [NC,OR] RewriteCond %{HTTP_USER_AGENT} wapi [NC,OR] RewriteCond %{HTTP_USER_AGENT} wapp [NC,OR] RewriteCond %{HTTP_USER_AGENT} wapr [NC,OR] RewriteCond %{HTTP_USER_AGENT} webc [NC,OR] RewriteCond %{HTTP_USER_AGENT} winw [NC,OR] RewriteCond %{HTTP_USER_AGENT} winw [NC,OR] RewriteCond %{HTTP_USER_AGENT} xda [NC,OR] RewriteCond %{HTTP_USER_AGENT} xda- [NC,OR] RewriteCond %{HTTP_USER_AGENT} up.browser [NC,OR] RewriteCond %{HTTP_USER_AGENT} up.link [NC,OR] RewriteCond %{HTTP_USER_AGENT} windows.ce [NC,OR] RewriteCond %{HTTP_USER_AGENT} iemobile [NC,OR] RewriteCond %{HTTP_USER_AGENT} mini [NC,OR] RewriteCond %{HTTP_USER_AGENT} mmp [NC,OR] RewriteCond %{HTTP_USER_AGENT} symbian [NC,OR] RewriteCond %{HTTP_USER_AGENT} midp [NC,OR] RewriteCond %{HTTP_USER_AGENT} wap [NC,OR] RewriteCond %{HTTP_USER_AGENT} phone [NC,OR] RewriteCond %{HTTP_USER_AGENT} ipad [NC,OR] RewriteCond %{HTTP_USER_AGENT} iphone [NC,OR] RewriteCond %{HTTP_USER_AGENT} iPad [NC,OR] RewriteCond %{HTTP_USER_AGENT} iPhone [NC,OR] RewriteCond %{HTTP_USER_AGENT} ipod [NC,OR] RewriteCond %{HTTP_USER_AGENT} iPod [NC,OR] RewriteCond %{HTTP_USER_AGENT} pocket [NC,OR] RewriteCond %{HTTP_USER_AGENT} mobile [NC,OR] RewriteCond %{HTTP_USER_AGENT} android [NC,OR] RewriteCond %{HTTP_USER_AGENT} Android [NC,OR] RewriteCond %{HTTP_USER_AGENT} pda [NC,OR] RewriteCond %{HTTP_USER_AGENT} PPC [NC,OR] RewriteCond %{HTTP_USER_AGENT} Series60 [NC,OR] RewriteCond %{HTTP_USER_AGENT} Opera.Mini [NC,OR] RewriteCond %{HTTP_USER_AGENT} Moby [NC,OR] RewriteCond %{HTTP_USER_AGENT} Mobi [NC,OR] # Проверить служебные заголовки, отсылаемые браузером RewriteCond %{HTTP_ACCEPT} "text/vnd.wap.wml" [NC,OR] RewriteCond %{HTTP_ACCEPT} "application/vnd.wap.xhtml+xml" [NC,OR] # Проверить исключения RewriteCond %{HTTP_USER_AGENT} !windows.nt [NC] RewriteCond %{HTTP_USER_AGENT} !bsd [NC] RewriteCond %{HTTP_USER_AGENT} !x11 [NC] RewriteCond %{HTTP_USER_AGENT} !unix [NC] RewriteCond %{HTTP_USER_AGENT} !macos [NC] RewriteCond %{HTTP_USER_AGENT} !macintosh [NC] RewriteCond %{HTTP_USER_AGENT} !playstation [NC] RewriteCond %{HTTP_USER_AGENT} !google [NC] RewriteCond %{HTTP_USER_AGENT} !yandex [NC] RewriteCond %{HTTP_USER_AGENT} !bot [NC] RewriteCond %{HTTP_USER_AGENT} !libwww [NC] RewriteCond %{HTTP_USER_AGENT} !msn [NC] RewriteCond %{HTTP_USER_AGENT} !america [NC] RewriteCond %{HTTP_USER_AGENT} !avant [NC] RewriteCond %{HTTP_USER_AGENT} !download [NC] RewriteCond %{HTTP_USER_AGENT} !fdm [NC] RewriteCond %{HTTP_USER_AGENT} !maui [NC] RewriteCond %{HTTP_USER_AGENT} !webmoney [NC] RewriteCond %{HTTP_USER_AGENT} !windows-media-player [NC] # При выполнении условий переадресация на мобильную версию сайта RewriteRule ^(.*)$ http://mobile.version.of.site.ru [L,R=302] </ifModule> #Универсальный 302 редирект на мобильную версию сайта <ifModule mod_rewrite.c> RewriteEngine on #Универсальный редирект на мобильную версию сайта RewriteCond %{HTTP_HOST} ^(.*)$ [NC] RewriteCond %{HTTP_USER_AGENT} (?i:midp|samsung|nokia|j2me|avant|docomo|novarra|palmos|palmsource|opwv|chtml|pda|mmp|blackberry|mib|symbian|wireless|nokia|hand|mobi|phone|cdm|upb|audio|SIE|SEC|samsung|HTC|mot-|mitsu|sagem|sony|alcatel|lg|eric|vx|NEC|philips|mmm|xx|panasonic|sharp|wap|sch|rover|pocket|benq|java|pt|pg|vox|amoi|bird|compal|kg|voda|sany|kdd|dbt|sendo|sgh|gradi|jb|dddi|moto|iphone|android) [NC] RewriteRule ^$ http://m.%1 [R=302,L] </ifModule> # .htaccess конец шаблона
Разъяснения по коду шаблона:
Расшифрую некоторые флаги из директив:
- RewriteCond … [NC] — NC значит регистр нечувствительное сравнение выполнять
- RewriteCond … [NC,OR] — NC см. выше, OR — значит объединять RewriteCond через OR, по умолчанию если ничего не указана то RewriteCond объединяются через AND оператор.
- RewriteRule … [L] — L значит закончить (остановить обработку) на этом RewriteRule правиле любые дальнейшие преобразования URL, т.е. последующие RewriteRule не выполнять.
- RewriteRule … [L,R=302] — L см. выше, R=302 значит выполнить редирект с кодом 302 на преобразованный URL
- RewriteRule … [R=301,QSA,L] — L и R см. выше, QSA — при преобразовании URL выполнять при стыковку заданных частей, а не замену.
- RewriteRule … [F] — F, значит отказать в выдачи результата по этому URL кодом 403 Forbidden.
- RewriteRule . — [G,L] G|Gone — [G] flag значит отдать код 410 Gone status — рекомендация забыть этот URL
AuthUserFile — задает путь к файлу с паролями для http авторизации пользователя. Путь может быть абсолютный от корня файловой системы Linux сервера или относительный от ServerRoot apache. В Ubuntu ServerRoot «/etc/apache2» по умолчанию. При задании относительного пути от ServerRoot apache начальный слеш в пути не указывается, иначе путь будет восприниматься как абсолютный от корня Linux. Также, если путь содержит недопустимые символы и пробелы его нужно заключать в кавычки, это общее правило.
Order, Deny, Allow
Теперь еще раз, но уже более детально, хотелось бы вернуться к директивам управление доступом: Order, Deny, Allow и более детально описать ее синтаксис и логику.
Директивы Allow, Deny, Order модуля mod_access_compat нежелательны к использованию и считаются устаревшими, хотя и поддерживаются еще в версиях Apache 2.3 и 2.4. В следующих версиях они будут удалены. Вместо них, начиная с версии Apache 2.3, этот функционал реализуется директивой Require, которая позволяет более гибко настраивать доступы, чем устаревшие директивы. Детали смотрите в статье «Контроль доступа клиента в Apache», которая подробно описывает директивы Require, Allow, Deny, Order с примерами их использования.
Директива Order синтаксис: Order [Deny,Allow] или [Allow,Deny]
По умолчанию директива Order имеет порядок: Deny,Allow. Обратите внимание, что Deny,Allow пишутся без пробела.
В зависимости от того в каком порядке указаны директивы Deny,Allow или Allow,Deny меняется логика работы.
Если Deny,Allow то запрещается доступ со всех IP кроме указанных, если Allow,Deny разрешается доступ со всех IP кроме оговоренных. Далее идут секции описания для доступа и запрета. Ключевое слово all означает со всех IP.
Например, что бы запретить (блокировать) доступ с IP x.x.x.x и x.x.x.xx и разрешить доступ всем остальным необходимо добавить в .htaccess следующий код:
# Разрешить ВСЕМ кроме указанных IP
Order Allow,Deny
Allow from all
Deny from x.x.x.x x.x.x.xx
Обратите внимание что IP записаны через пробел. Можно также указать IP как IP/маска.
Для обратной ситуации, что бы запретить доступ со всех IP кроме x.x.x.x и x.x.x.xx нам необходимо добавить в .htaccess следующий код:
# Запретить ВСЕМ кроме указанных IP
Order Deny,Allow
Deny from all
Allow from x.x.x.x x.x.x.xx
Запрет или разрешение можно указывать и на отдельный файл или группы файлов. Например, что бы запретить доступ всех кроме IP x.x.x.x к файлу passwd.html, который расположен в текущей директории.
# Запретить файл passwd.html ВСЕМ кроме указанных IP
<Files «passwd.html»>
Order Deny,Allow
Deny from all
Allow from x.x.x.x
</Files>
Аналогично можно запретить или разрешить доступ к определенной группе файлов описав их через регулярное выражение. Например, к файлам с расширением «.key»:
# Запретить файлы *.key ВСЕМ кроме указанных IP
<Files «.(key)$»>
Order Deny,Allow
Deny from all
Allow from x.x.x.x
</Files>
Шаблон получился большой, но на практике нужно стремиться использовать только действительно крайне необходимые директивы. Особенно осторожно нужно поступать с внешними редиректами, так как они приводят к общему увеличению времени обработки запроса. Поэтому делайте их только если они действительно необходимы. Еще хочется предостеречь Вас от прямого копипаста директив из приведенного мною шаблона в ваши реальные конфиги. Код приведенный здесь используйте только для примера, что бы получить представление, что вообще возможно и как это будет выглядеть. В свои же файлы вставляете только те директивы, синтаксис которых вы понимаете, можете расшифровать и которые вы проверили по официальному руководству apache. Ошибки по исполнению директив из файла .htaccess смотрите в логах apache.
Apache .htaccess files allow users to configure directories of the web server they control without modifying the main configuration file.
While this is useful it’s important to note that using .htaccess
files slows down Apache, so, if you have access to the main server configuration file (which is usually called httpd.conf
), you should add this logic there under a Directory
block.
See .htaccess in the Apache HTTPD documentation site for more details about what .htaccess files can do.
The remainder of this document will discuss different configuration options you can add to .htaccess
and what they do.
Most of the following blocks use the IfModule directive to only execute the instructions inside the block if the corresponding module was properly configured and the server loaded it. This way we save our server from crashing if the module wasn’t loaded.
Redirects
There are times when we need to tell users that a resource has moved, either temporarily or permanently. This is what we use Redirect
and RedirectMatch
for.
<IfModule mod_alias.c> # Redirect to a URL on a different host Redirect "/service" "http://foo2.example.com/service" # Redirect to a URL on the same host Redirect "/one" "/two" # Equivalent redirect to URL on the same host Redirect temp "/one" "/two" # Permanent redirect to a URL on the same host Redirect permanent "/three" "/four" # Redirect to an external URL # Using regular expressions and RedirectMatch RedirectMatch "^/oldfile.html/?$" "http://example.com/newfile.php" </IfModule>
The possible values for the first parameter are listed below. If the first parameter is not included, it defaults to temp
.
- permanent
-
Returns a permanent redirect status (301) indicating that the resource has moved permanently.
- temp
-
Returns a temporary redirect status (302). This is the default.
- seeother
-
Returns a «See Other» status (303) indicating that the resource has been replaced.
- gone
-
Returns a «Gone» status (410) indicating that the resource has been permanently removed. When this status is used the URL argument should be omitted.
Cross-origin resources
The first set of directives control CORS (Cross-Origin Resource Sharing) access to resources from the server. CORS is an HTTP-header based mechanism that allows a server to indicate the external origins (domain, protocol, or port) which a browser should permit loading of resources.
For security reasons, browsers restrict cross-origin HTTP requests initiated from scripts. For example, XMLHttpRequest and the Fetch API follow the same-origin policy. A web application using those APIs can only request resources from the same origin the application was loaded from unless the response from other origins includes the appropriate CORS headers.
General CORS access
This directive will add the CORS header for all resources in the directory from any website.
<IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule>
Unless you override the directive later in the configuration or in the configuration of a directory below where you set this one, every request from external servers will be honored, which is unlikely to be what you want.
One alternative is to explicitly state what domains have access to the content of your site. In the example below, we restrict access to a subdomain of our main site (example.com). This is more secure and, likely, what you intended to do.
<IfModule mod_headers.c> Header set Access-Control-Allow-Origin "subdomain.example.com" </IfModule>
Cross-origin images
As reported in the Chromium Blog and documented in Allowing cross-origin use of images and canvas can lead to fingerprinting attacks.
To mitigate the possibility of these attacks, you should use the crossorigin
attribute in the images you request and the code snippet below in your .htaccess
to set the CORS header from the server.
<IfModule mod_setenvif.c> <IfModule mod_headers.c> <FilesMatch ".(bmp|cur|gif|ico|jpe?g|a?png|svgz?|webp|heic|heif|avif)$"> SetEnvIf Origin ":" IS_CORS Header set Access-Control-Allow-Origin "*" env=*IS_CORS* </FilesMatch> </IfModule> </IfModule>
Google Chrome’s Google Fonts troubleshooting guide tells us that, while Google Fonts may send the CORS header with every response, some proxy servers may strip it before the browser can use it to render the font.
<IfModule mod_headers.c> <FilesMatch ".(eot|otf|tt[cf]|woff2?)$"> Header set Access-Control-Allow-Origin "*" </FilesMatch> </IfModule>
Cross-origin resource timing
The Resource Timing Level 1 specification defines an interface for web applications to access the complete timing information for resources in a document.
The Timing-Allow-Origin response header specifies origins that are allowed to see values of attributes retrieved via features of the Resource Timing API, which would otherwise be reported as zero due to cross-origin restrictions.
If a resource isn’t served with a Timing-Allow-Origin
or if the header does not include the origin, after making the request some attributes of the PerformanceResourceTiming
object will be set to zero.
<IfModule mod_headers.c> Header set Timing-Allow-Origin: "*" </IfModule>
Custom Error Pages/Messages
Apache allows you to provide custom error pages for users depending on the type of error they receive.
The error pages are presented as URLs. These URLs can begin with a slash (/) for local web-paths (relative to the DocumentRoot), or be a full URL which the client can resolve.
See the ErrorDocument Directive documentation on the HTTPD documentation site for more information.
ErrorDocument 500 /errors/500.html ErrorDocument 404 /errors/400.html ErrorDocument 401 https://example.com/subscription_info.html ErrorDocument 403 "Sorry, can't allow you access today"
Error prevention
This setting affects how MultiViews work for the directory the configuration applies to.
The effect of MultiViews
is as follows: if the server receives a request for /some/dir/foo, if /some/dir has MultiViews
enabled, and /some/dir/foo does not exist, then the server reads the directory looking for files named foo.*, and effectively fakes up a type map which names all those files, assigning them the same media types and content-encodings it would have if the client had asked for one of them by name. It then chooses the best match to the client’s requirements.
The setting disables MultiViews
for the directory this configuration applies to and prevents Apache from returning a 404 error as the result of a rewrite when the directory with the same name does not exist
Apache uses mod_mime to assign content metadata to the content selected for an HTTP response by mapping patterns in the URI or filenames to the metadata values.
For example, the filename extensions of content files often define the content’s Internet media type, language, character set, and content-encoding. This information is sent in HTTP messages containing that content and used in content negotiation when selecting alternatives, such that the user’s preferences are respected when choosing one of several possible contents to serve.
Changing the metadata for a file does not change the value of the Last-Modified header. Thus, previously cached copies may still be used by a client or proxy, with the previous headers. If you change the metadata (language, content type, character set, or encoding) you may need to ‘touch’ affected files (updating their last modified date) to ensure that all visitors receive the corrected content headers.
Serve resources with the proper media types (a.k.a. MIME types)
Associates media types with one or more extensions to make sure the resources will be served appropriately.
Servers should use text/javascript for JavaScript resources as indicated in the HTML specification
<IfModule mod_expires.c> # Data interchange AddType application/atom+xml atom AddType application/json json map topojson AddType application/ld+json jsonld AddType application/rss+xml rss AddType application/geo+json geojson AddType application/rdf+xml rdf AddType application/xml xml # JavaScript AddType text/javascript js mjs # Manifest files AddType application/manifest+json webmanifest AddType application/x-web-app-manifest+json webapp AddType text/cache-manifest appcache # Media files AddType audio/mp4 f4a f4b m4a AddType audio/ogg oga ogg opus AddType image/bmp bmp AddType image/svg+xml svg svgz AddType image/webp webp AddType video/mp4 f4v f4p m4v mp4 AddType video/ogg ogv AddType video/webm webm AddType image/x-icon cur ico # HEIF Images AddType image/heic heic AddType image/heif heif # HEIF Image Sequence AddType image/heics heics AddType image/heifs heifs # AVIF Images AddType image/avif avif # AVIF Image Sequence AddType image/avis avis # WebAssembly AddType application/wasm wasm # Web fonts AddType font/woff woff AddType font/woff2 woff2 AddType application/vnd.ms-fontobject eot AddType font/ttf ttf AddType font/collection ttc AddType font/otf otf # Other AddType application/octet-stream safariextz AddType application/x-bb-appworld bbaw AddType application/x-chrome-extension crx AddType application/x-opera-extension oex AddType application/x-xpinstall xpi AddType text/calendar ics AddType text/markdown markdown md AddType text/vcard vcard vcf AddType text/vnd.rim.location.xloc xloc AddType text/vtt vtt AddType text/x-component htc </IfModule>
Set the default Charset attribute
Every piece of content on the web has a character set. Most, if not all, the content is UTF-8 Unicode.
Use AddDefaultCharset to serve all resources labeled as text/html
or text/plain
with the UTF-8
charset.
<IfModule mod_mime.c> AddDefaultCharset utf-8 </IfModule>
Serve the following file types with the charset
parameter set to UTF-8
using the AddCharset directive available in mod_mime
.
<IfModule mod_mime.c> AddCharset utf-8 .appcache .bbaw .css .htc .ics .js .json .manifest .map .markdown .md .mjs .topojson .vtt .vcard .vcf .webmanifest .xloc </IfModule>
Mod_rewrite and the RewriteEngine directives
mod_rewrite provides a way to modify incoming URL requests, dynamically, based on regular expression rules. This allows you to map arbitrary URLs onto your internal URL structure in any way you like.
It supports an unlimited number of rules and an unlimited number of attached rule conditions for each rule to provide a really flexible and powerful URL manipulation mechanism. The URL manipulations can depend on various tests: server variables, environment variables, HTTP headers, timestamps, external database lookups, and various other external programs or handlers, can be used to achieve granular URL matching.
Enable mod_rewrite
The basic pattern to enable mod_rewrite
is a pre-requisite for all other tasks that use.
The required steps are:
- Turn on the rewrite engine (this is necessary in order for the
RewriteRule
directives to work) as documented in the RewriteEngine documentation - Enable the
FollowSymLinks
option if it isn’t already. See Core Options documentation - If your web host doesn’t allow the
FollowSymlinks
option, you need to comment it out or remove it, and then uncomment theOptions +SymLinksIfOwnerMatch
line, but be aware of the performance impact- Some cloud hosting services will require you set
RewriteBase
- See Rackspace FAQ and the HTTPD documentation
- Depending on how your server is set up, you may also need to use the
RewriteOptions
directive to enable some options for the rewrite engine
- Some cloud hosting services will require you set
<IfModule mod_rewrite.c> RewriteEngine On Options +FollowSymlinks # Options +SymLinksIfOwnerMatch # RewriteBase / # RewriteOptions <options> </IfModule>
Forcing https
These Rewrite rules will redirect from the http://
insecure version to the https://
secure version of the URL as described in the Apache HTTPD wiki.
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] </IfModule>
If you’re using cPanel AutoSSL or the Let’s Encrypt webroot method to create your SSL certificates, it will fail to validate the certificate if validation requests are redirected to HTTPS. Turn on the condition(s) you need.
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} !=on RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/ RewriteCond %{REQUEST_URI} !^/.well-known/cpanel-dcv/[w-]+$ RewriteCond %{REQUEST_URI} !^/.well-known/pki-validation/[A-F0-9]{32}.txt(?: Comodo DCV)?$ RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </IfModule>
Redirecting from www. URLs
These directives will rewrite www.example.com
to example.com
.
You should not duplicate content in multiple origins (with and without www);This can cause SEO problems (duplicate content), and therefore, you should choose one of the alternatives and redirect the other one. You should also use Canonical URLs to indicate which URL should search engines crawl (if they support the feature).
Set %{ENV:PROTO}
variable, to allow rewrites to redirect with the appropriate schema automatically (http or https).
The rule assumes by default that both HTTP and HTTPS environments are available for redirection.
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} =on RewriteRule ^ - [E=PROTO:https] RewriteCond %{HTTPS} !=on RewriteRule ^ - [E=PROTO:http] RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC] RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L] </IfModule>
Inserting the www. at the beginning of URLs
These rules will insert www.
at the beginning of a URL. It’s important to note that you should never make the same content available under two different URLs.
This can cause SEO problems (duplicate content), and therefore, you should choose one of the alternatives and redirect the other one. For search engines that support them you should use Canonical URLs to indicate which URL should search engines crawl.
Set %{ENV:PROTO}
variable, to allow rewrites to redirect with the appropriate schema automatically (http or https).
The rule assumes by default that both HTTP and HTTPS environments are available for redirection. If your SSL certificate could not handle one of the domains used during redirection, you should turn the condition on.
The following might not be a good idea if you use «real» subdomains for certain parts of your website.
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} =on RewriteRule ^ - [E=PROTO:https] RewriteCond %{HTTPS} !=on RewriteRule ^ - [E=PROTO:http] RewriteCond %{HTTPS} !=on RewriteCond %{HTTP_HOST} !^www. [NC] RewriteCond %{SERVER_ADDR} !=127.0.0.1 RewriteCond %{SERVER_ADDR} !=::1 RewriteRule ^ %{ENV:PROTO}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </IfModule>
Frame Options
The example below sends the X-Frame-Options
response header with DENY as the value, informing browsers not to display the content of the web page in any frame to protect the website against clickjacking.
This might not be the best setting for everyone. You should read about the other two possible values for the X-Frame-Options
header: SAMEORIGIN
and ALLOW-FROM
.
While you could send the X-Frame-Options
header for all of your website’s pages, this has the potential downside that it forbids even any framing of your content (e.g.: when users visit your website using a Google Image Search results page).
Nonetheless, you should ensure that you send the X-Frame-Options
header for all pages that allow a user to make a state-changing operation (e.g., pages that contain one-click purchase links, checkout, or bank-transfer confirmation pages, pages that make permanent configuration changes, etc.).
<IfModule mod_headers.c> Header always set X-Frame-Options "DENY" "expr=%{CONTENT_TYPE} =~ m#text/html#i" </IfModule>
Content Security Policy (CSP)
CSP (Content Security Policy) mitigates the risk of cross-site scripting and other content-injection attacks by setting a Content Security Policy
which allows trusted sources of content for your website.
There is no policy that fits all websites, the example below is meant as guidelines for you to modify for your site.
The example policy below:
To make your CSP implementation easier, you can use an online CSP header generator. You should also use a validator to make sure your header does what you want it to do.
<IfModule mod_headers.c> Content-Security-Policy "default-src 'self'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests" "expr=%{CONTENT_TYPE} =~ m#text/(html|javascript)|application/pdf|xml#i" </IfModule>
Directory access
This directive will prevent access to directories that don’t have an index file present in whatever format the server is configured to use, like index.html
, or index.php
.
<IfModule mod_autoindex.c> Options -Indexes </IfModule>
In Macintosh and Linux systems, files that begin with a period are hidden from view but not from access if you know their name and location. These types of files usually contain user preferences or the preserved state of a utility, and can include rather private places like, for example, the .git
or .svn
directories.
The .well-known/
directory represents the standard (RFC 5785) path prefix for «well-known locations» (e.g.: /.well-known/manifest.json
, /.well-known/keybase.txt
), and therefore, access to its visible content should not be blocked.
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} "!(^|/).well-known/([^./]+./?)+$" [NC] RewriteCond %{SCRIPT_FILENAME} -d [OR] RewriteCond %{SCRIPT_FILENAME} -f RewriteRule "(^|/)." - [F] </IfModule>
Block access to files with sensitive information
Block access to backup and source files that may be left by some text editors and can pose a security risk when anyone has access to them.
Update the <FilesMatch>
regular expression in the following example to include any files that might end up on your production server and can expose sensitive information about your website. These files may include: configuration files or files that contain metadata about the project among others.
<IfModule mod_authz_core.c> <FilesMatch "(^#.*#|.(bak|conf|dist|fla|in[ci]|log|orig|psd|sh|sql|sw[op])|~)$"> Require all denied </FilesMatch> </IfModule>
HTTP Strict Transport Security (HSTS)
If a user types example.com
in their browser, even if the server redirects them to the secure version of the website, that still leaves a window of opportunity (the initial HTTP connection) for an attacker to downgrade or redirect the request.
The following header ensures that a browser only connects to your server via HTTPS, regardless of what the users type in the browser’s address bar.
Be aware that Strict Transport Security is not revokable, and you must ensure being able to serve the site over HTTPS for as long as you’ve specified in the max-age
directive. If you don’t have a valid TLS connection anymore (e.g. due to an expired TLS certificate) your visitors will see an error message even when attempting to connect over HTTP.
<IfModule mod_headers.c> # Header always set Strict-Transport-Security "max-age=16070400; includeSubDomains" "expr=%{HTTPS} == 'on'" # (1) Enable your site for HSTS preload inclusion. # Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'" </IfModule>
Prevent some browsers from MIME-sniffing the response
- Restricts all fetches by default to the origin of the current website by setting the
default-src
directive to'self'
— which acts as a fallback to all Fetch directives.- This is convenient as you do not have to specify all Fetch directives that apply to your site, for example:
connect-src 'self'; font-src 'self'; script-src 'self'; style-src 'self'
, etc - This restriction also means that you must explicitly define from which site(s) your website is allowed to load resources from, otherwise it will be restricted to the same origin as the page making the request
- This is convenient as you do not have to specify all Fetch directives that apply to your site, for example:
- Disallows the
<base>
element on the website. This is to prevent attackers from changing the locations of resources loaded from relative URLs- If you want to use the
<base>
element, then usebase-uri 'self'
instead
- If you want to use the
- Only allows form submissions are from the current origin with:
form-action 'self'
- Prevents all websites (including your own) from embedding your webpages within e.g. the
<iframe>
or<object>
element by setting:frame-ancestors 'none'
.- The
frame-ancestors
directive helps avoid clickjacking attacks and is similar to theX-Frame-Options
header - Browsers that support the CSP header will ignore
X-Frame-Options
ifframe-ancestors
is also specified
- The
- Forces the browser to treat all the resources that are served over HTTP as if they were loaded securely over HTTPS by setting the
upgrade-insecure-requests
directiveupgrade-insecure-requests
does not ensure HTTPS for the top-level navigation. If you want to force the website itself to be loaded over HTTPS you must include theStrict-Transport-Security
header
- Includes the
Content-Security-Policy
header in all responses that are able to execute scripting. This includes the commonly used file types: HTML, XML and PDF documents. Although JavaScript files can not execute scripts in a «browsing context», they are included to target web workers
Some older browsers would try and guess the content type of a resource, even when it isn’t properly set up on the server configuration. This reduces exposure to drive-by download attacks and cross-origin data leaks.
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" </IfModule>
Referrer Policy
We include the Referrer-Policy
header in responses for resources that are able to request (or navigate to) other resources.
This includes commonly used resource types: HTML, CSS, XML/SVG, PDF documents, scripts, and workers.
To prevent referrer leakage entirely, specify the no-referrer
value instead. Note that the effect could negatively impact analytics tools.
Use services like the ones below to check your Referrer Policy:
- securityheaders.com
- Mozilla Observatory
<IfModule mod_headers.c> Header always set Referrer-Policy "strict-origin-when-cross-origin" "expr=%{CONTENT_TYPE} =~ m#text/(css|html|javascript)|application/pdf|xml#i" </IfModule>
Disable TRACE HTTP Method
The TRACE method, while seemingly harmless, can be successfully leveraged in some scenarios to steal legitimate users’ credentials. See A Cross-Site Tracing (XST) attack and OWASP Web Security Testing Guide
Modern browsers now prevent TRACE requests made via JavaScript, however, other ways of sending TRACE requests with browsers have been discovered, such as using Java.
If you have access to the main server configuration file, use the TraceEnable
directive instead.
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_METHOD} ^TRACE [NC] RewriteRule .* - [R=405,L] </IfModule>
Some frameworks like PHP and ASP.NET set an X-Powered-By
header that contains information about them (e.g.: their name, version number)
This header doesn’t provide any value, and in some cases, the information it provides can expose vulnerabilities
<IfModule mod_headers.c> Header unset X-Powered-By Header always unset X-Powered-By </IfModule>
If you can, you should disable the X-Powered-By
header from the language/framework level (e.g.: for PHP, you can do that by setting the following in php.ini
.
Prevent Apache from adding a trailing footer line containing information about the server to the server-generated documents (e.g.: error messages, directory listings, etc.). See ServerSignature Directive for more information on what the server signature provides and the ServerTokens Directive for information about configuring the information provided in the signature.
Some proxies and security software mangle or strip the Accept-Encoding
HTTP header. See Pushing Beyond Gzipping for a more detailed explanation.
<IfModule mod_deflate.c> <IfModule mod_setenvif.c> <IfModule mod_headers.c> SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)s*,?s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding </IfModule> </IfModule> </IfModule>
Compress all output labeled with one of the following media types using the AddOutputFilterByType Directive.
<IfModule mod_deflate.c> <IfModule mod_filter.c> AddOutputFilterByType DEFLATE "application/atom+xml" "application/javascript" "application/json" "application/ld+json" "application/manifest+json" "application/rdf+xml" "application/rss+xml" "application/schema+json" "application/geo+json" "application/vnd.ms-fontobject" "application/wasm" "application/x-font-ttf" "application/x-javascript" "application/x-web-app-manifest+json" "application/xhtml+xml" "application/xml" "font/eot" "font/opentype" "font/otf" "font/ttf" "image/bmp" "image/svg+xml" "image/vnd.microsoft.icon" "text/cache-manifest" "text/calendar" "text/css" "text/html" "text/javascript" "text/plain" "text/markdown" "text/vcard" "text/vnd.rim.location.xloc" "text/vtt" "text/x-component" "text/x-cross-domain-policy" "text/xml" </IfModule> </IfModule>
Map the following filename extensions to the specified encoding type using AddEncoding so Apache can serve the file types with the appropriate Content-Encoding
response header (this will NOT make Apache compress them!). If these files types were served without an appropriate Content-Encoding
response header, client applications (e.g.: browsers) wouldn’t know that they first need to uncompress the response, and thus, wouldn’t be able to understand the content.
<IfModule mod_deflate.c> <IfModule mod_mime.c> AddEncoding gzip svgz </IfModule> </IfModule>
Cache expiration
Serve resources with a far-future expiration date using the mod_expires module, and Cache-Control and Expires headers.
<IfModule mod_expires.c> ExpiresActive on ExpiresDefault "access plus 1 month" # CSS ExpiresByType text/css "access plus 1 year" # Data interchange ExpiresByType application/atom+xml "access plus 1 hour" ExpiresByType application/rdf+xml "access plus 1 hour" ExpiresByType application/rss+xml "access plus 1 hour" ExpiresByType application/json "access plus 0 seconds" ExpiresByType application/ld+json "access plus 0 seconds" ExpiresByType application/schema+json "access plus 0 seconds" ExpiresByType application/geo+json "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" ExpiresByType text/calendar "access plus 0 seconds" ExpiresByType text/xml "access plus 0 seconds" # Favicon (cannot be renamed!) and cursor images ExpiresByType image/vnd.microsoft.icon "access plus 1 week" ExpiresByType image/x-icon "access plus 1 week" # HTML ExpiresByType text/html "access plus 0 seconds" # JavaScript ExpiresByType text/javascript "access plus 1 year" # Manifest files ExpiresByType application/manifest+json "access plus 1 week" ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" ExpiresByType text/cache-manifest "access plus 0 seconds" # Markdown ExpiresByType text/markdown "access plus 0 seconds" # Media files ExpiresByType audio/ogg "access plus 1 month" ExpiresByType image/bmp "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType image/webp "access plus 1 month" # PNG and animated PNG ExpiresByType image/apng "access plus 1 month" ExpiresByType image/png "access plus 1 month" # HEIF Images ExpiresByType image/heic "access plus 1 month" ExpiresByType image/heif "access plus 1 month" # HEIF Image Sequence ExpiresByType image/heics "access plus 1 month" ExpiresByType image/heifs "access plus 1 month" # AVIF Images ExpiresByType image/avif "access plus 1 month" # AVIF Image Sequence ExpiresByType image/avis "access plus 1 month" ExpiresByType video/mp4 "access plus 1 month" ExpiresByType video/ogg "access plus 1 month" ExpiresByType video/webm "access plus 1 month" # WebAssembly ExpiresByType application/wasm "access plus 1 year" # Web fonts # Collection ExpiresByType font/collection "access plus 1 month" # Embedded OpenType (EOT) ExpiresByType application/vnd.ms-fontobject "access plus 1 month" ExpiresByType font/eot "access plus 1 month" # OpenType ExpiresByType font/opentype "access plus 1 month" ExpiresByType font/otf "access plus 1 month" # TrueType ExpiresByType application/x-font-ttf "access plus 1 month" ExpiresByType font/ttf "access plus 1 month" # Web Open Font Format (WOFF) 1.0 ExpiresByType application/font-woff "access plus 1 month" ExpiresByType application/x-font-woff "access plus 1 month" ExpiresByType font/woff "access plus 1 month" # Web Open Font Format (WOFF) 2.0 ExpiresByType application/font-woff2 "access plus 1 month" ExpiresByType font/woff2 "access plus 1 month" # Other ExpiresByType text/x-cross-domain-policy "access plus 1 week" </IfModule>
.htaccess (с точкой в начале имени) — это файл-конфигуратор Apache-серверов, который дает возможность конфигурировать работу сервера в отдельных директориях (папках), не предоставляя доступа к главному конфигурационному файлу. Например, устанавливать права доступа к файлам в директории, менять названия индексных файлов, самостоятельно обрабатывать ошибки Apache, перенаправляя посетителей на специальные страницы ошибок. .htaccess представляет собой обычный текстовый документ, расширение которого htaccess. Данный файл обычно находится в корне сайта, однако Вы можете создавать и дополнительные .htaccess-файлы для различных директорий Вашего сайта.
Mod_rewrite — модуль, используемый веб-серверами для преобразования URL.
Директивы модуля Mod_rewrite
- RewriteBase
- RewriteCond
- RewriteEngine
- RewriteLock
- RewriteLog
- RewriteLogLevel
- RewriteMap
- RewriteOptions
- RewriteRule
Варианты реализации Редиректа с помощью файла .htaccess
- Простой редирект:
Redirect 301 / http://www.domain.ru/
или
redirect /secret http://www.site.ru/nosecret
Ставится в файле .htaccess или httpd.conf для Apache. Первый «/» означает, что всё с верхнего уровня сайта, включая все подкаталоги, будет переадресовано (не забывайте поставить последний «/»). Если Вы хотите переадресовать только страницу, сохранив PR старой страницы, можно сделать так:
Redirect 301 /old/old.htm http://www.domain.ru/new.htm где:
/old/old.htm — путь и имя старой страницы
http://www.domain.com/new.htm — новый путь и новое имя перемещенной страницы - Редирект на любую страницу по ip пользователя или при запросе конкретной страницы (а также по маске имени).
Если у пользователя ip 192.152.37.125, то он будет перенаправлен на страницу user.php:SetEnvIf REMOTE_ADDR 192.152.37.125 REDIR="redir" RewriteCond %{REDIR} redir RewriteRule ^/$ /user.php
- Редирект при запросе определённых файлов. Если запрашиваются файлы, расширение которых не указано в файле .htaccess (gif и jpg), то следует перенаправление:
RewriteEngine On RewriteRule !.(gif|jpg)$ index.php
- Использование mod_rewrite:
Options +FollowSymLinks RewriteEngine on RewriteCond %{HTTP_HOST} ^domain.ru RewriteRule ^(.*)$ http://www.domain.ru/$1 [R=permanent,L]
- Редирект с регулярным выражением:
RedirectMatch 301 (.*) http://www.domain.ru$1 Прописывается в файле .htaccess.
(.*) RedirectMatch фактически соответствует регулярным образцам выражения после доменного имени. Таким образом, нельзя выполнить соответствие образца на ^/domain.ru. Однако, можно преобразовать страницы с использованием .html расширения к файлам того же самого названия, но с .php расширением:
RedirectMatch 301 (.*).html$ http://www.domain.ru$1.php
Если необходимо сделать различное перенаправление для отдельных страниц, можно использовать следующее:
RedirectMatch Permanent ^/html/resources.html$ http://www.domain.com/resources.php RedirectMatch Permanent ^/html/other_page.html$ http://www.domain.com/other_page.php RedirectMatch Permanent ^/(.*)$ http://www.domain.com/
«RedirectMatch Permanent» — это эквивалент «RedirectMatch 301», строка с «*(Wildcard)» должна быть последней в этом списке.
- Создание удобо читаемых URL
Чтобы преобразовать, например, www.domain.ru/product.php?id=123 в www.domain.ru/product/123 следующим образом:RewriteEngine on RewriteRule ^product/([^/.]+)/?$ product.php?id=$1 [L]
В следующем примере преобразуем www.domain.ru/script.php?product=123 в www.domain.ru/cat/product/123/:
RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$2
- Редирект на PHP:
header("HTTP/1.1 301 Moved Permanently"); header("Location: http://www.domain.ru/newdir/newpage.htm"); exit();
Естественно, надо создать страницу, при обращении к которой и будет происходить Редирект, и разместить её на сервере. И лучше укажите HTTP/1.1 (а не HTTP/1.0 или HTTP/0.9, которые не поддерживают виртуальный хостинг)
- Редирект всех файлов в папке на один файл.
Например вы больше не нуждаетесь в разделе сайта Files и хотите перенаправить все запросы к папке /files на один файл /page.php. Для этого добавляем в .htaccess следующий код.RewriteRule ^files(.*)$ /page.php [L,R=301]
- Редирект всей папки кроме одного файла
В следующем примере все файлы из папки /files будут редиректится на на файл /page.php, кроме файла /files/test.html котоый должен редиректится на /test-1.htmlRewriteRule ^files/test.html /test-1.html [L,R=301] RewriteRule ^files(.*)$ /page.php [L,R=301]
- Редирект динамического URL на новый файл.
Данный вариант пригодится если вы хотите редиректить динамический URL с параметрами на новый статический файл.RewriteRule ^article.jsp?id=(.*)$ /test.htm [L,R=301]
То есть теперь, запрос к файлу вида http://www.domain.ru/article.jsp?id=8547 и/или http://www.domain.ru/article.jsp?id=1234 будет отправлен на файл http://www.domain.ru/test.htm.
- Массовый редирект новых файлов.
Тепепь перейдем к самому сложному моменту, когда вам надо редиректить массу URL-ов, например после смены вашей CMS. Тут сразу возникает ряд проблем. Во-первых, внесение всех изменившихся адресов в .htaccess файл займет очень много времени, да и само по себе занятие малоприятное. Во-вторых, слишком много записей в .htaccess файле будут тормозить Apache сервера. И в третьих, при внесении такого количества информации высока вероятность, что вы где то ошибетесь. По этому, самый лучший выход, это нанять програмиста который вам напишет динамический редирект.
Нижеприведенный пример написан на PHP, но так же может быть выполнен на любом языке. Предположим вы перешли на новую систему ссылок на вашем сайте и все файлы оканчивающиеся на старый id должны быть средирекчены. Сначала создаем в базе таблицу, которая содержит старый id и новый URL для редиректа. old_id INT new_url VARCHAR (255) Далее пишем код который свяжет ваши старые id с новыми URL-ами
После этого, добавляем следующую строчку в .htaccess:RewriteRule ^/product-(.*)_([0-9]+).php /redirectold.php?productid=$2
затем создаем PHP файл redirectold.php, который будет поддерживать 301 редирект:
Теперь все запросы к вашим старым URL-ам будут вызывать redirectold.php, который найдет новый URL и вернет 301 ответ с вашей новой ссылкой.
Редиректы в зависимости от времени
Когда нужно применять уловки типа содержания зависящего от времени масса вебмастеров все ещё используют CGI скрипты которые производят редиректы на специальные страницы. Как это может быть сделано через mod_rewrite?
Есть много переменных названных TIME_xxx для условий редиректа. В связке со специальными лексикографическими образцами для сравнения STRING и =STRING мы можем производить редиректы зависящие от времени:
RewriteEngine on RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700 RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900 RewriteRule ^foo.html$ foo.day.html RewriteRule ^foo.html$ foo.night.html
Это выдает содержимое foo.day.html при запросе URL foo.html с 07:00 до 19:00 а в оставшееся время содержимое foo.night.html.
- Убираем у всех запросов вначале «WWW.»
RewriteEngine on # оглашаем, что хотим использовать mod_rewrite RewriteCond %{HTTP_HOST} ^www.(.*) [NC] RewriteRule ^/?(.*) http://%1/$1 [L,R=permanent]
- Меняем расширение .html на .php
Иногда бывает так, что у Вас статичный веб-сайт, а Вам необходимо, чтобы на нем срабатывал какой-нибудь php-скрипт. Для этого Вам необходимо сказать серверу, чтобы он обрабатывал эту страницу как php-файл.AddHandler application/x-httpd-php .html
Этот прием можно использовать и для других расширений файлов:
AddHandler application/x-httpd-php .xml AddHandler application/x-httpd-php .asp
Запрещение доступа в конкретную директорию
- для всех ко всем файлам в директории:
deny from all
- к конкретному файлу:
deny from all
- по ip пользователя:
order deny,allow deny from all allow from 192.152.37.125
Доступ в данную директорию будет разрешён только пользователю с ip 192.152.37.125.
- Директива Options -Indexes — запрет на отображение содержимого каталога при отсутствии индексного файла Иногда нужно сделать так, чтобы в случае отсутствия в каталоге файла, который показывается по умолчанию, не выдавался список файлов в каталоге. Тогда можно добавить в .htaccess такую строчку :
Options -Indexes
В этом случае вместо списка файлов в каталоге посетитель получит HTTP ошибку 403 — access forbidden.
- Запретить доступа к файлам с несколькими типа расширений deny from all Запрещен доступ к файлам с расширением *.inc, *.conf и *.cfg. Хотя директива, по умолчанию, не работает с регулярными выражениями, но их можно включить поставив символ тильды(~) в опциях директивы. Синтаксис следующий: [тильда] [пробел] [далее_все_без_пробелов] Чтобы блокировать этот доступ, запишем следующее:
RewriteRule ^.htaccess$ - [F]
Это правило переводится так:
Если кто-то пробует обращаться к файлу .htaccess, система должна произвести код ошибки ‘HTTP response of 403’ или ‘403 Forbidden — You don’t have permission to access /.htaccess on this server’.Конструкция ^.htaccess$ в этом регулярном выражении означает:
^ — якорь начала строки
$ — якорь конца строки
. — в регулярных выражениях точка ‘.’ обозначает мета-символ и должна быть защищена обратным слэшем (backslash), если Вы все-таки хотите использовать именно фактическую точку.Имя файла должно быть расположено точно между начальным и конечным якорем. Это будет гарантировать то, что только это определенное имя файла и никакое другое, сгенерирует код ошибки.
[F] — специальный ‘запрещающий’ флажок (forbidden).
[NC] — не учитывать регистр букв.
[OR] — означает ‘или следующее условие’.
Определение кодировки
Определение кодировки, в которой сервер «отдает» файлы
AddDefaultCharset windows-1251
варианты: KOI8-R, UTF-8, Windows-1251
Определение кодировки на загружаемые файлы
CharsetSourceEnc windows-1251
Установка пароля на директорию с помощью .htaccess
Для установки пароля на директорию можно воспользоваться системой базовой авторизации, предусмотренной в веб-сервере Apache. Создаем в каталоге, к которому хотим ограничить доступ по паролю, файл .htaccess с такими директивами:
AuthType Basic AuthName "Some Name" AuthUserFile /www/some_login/www/htdocs/some_dir/.htpasswd require valid-user
Путь /www/some_login/www/htdocs/some_dir/.htpasswd обозначает полный путь к файлу паролей на диске нашего сервера. Если, например, вы поместите файл .htpasswd (в нем будут пароли) в домашний каталог, куда вы попадаете, зайдя на сервер по FTP, то путь к этому файлу будет иметь вид /www/some_login/www/htdocs/some_dir/.htpasswd, где some_login — Ваш логин. В директиве AuthUserFile указываем абсолютный путь к файлу с логинами/паролями, который мы создадим чуть позже. Если вы создаете файл .htaccess на своем компьютере, а не сразу на сервере используя текстовый редактор, обратите особое внимание на то, что .htaccess должен передаваться по FTP строго в текстовом (ASCII) режиме.
Создаем файл паролей. Файл с паролями должен содержать строки вида login:password. Пароль должен быть зашифрован с использованием алгоритма MD5. Один из способов создать такой файл — воспользоваться программой, входящей в поставку Apache — htpasswd (на нашем сервере она находится в каталоге /usr/local/apache/bin, полный путь — /usr/local/apache/bin/htpasswd).
Рассмотрим, как создать файл паролей в unix shell прямо на сервере. Зайдем в shell и будем выполнять следующие команды:
htpasswd -mbc .htpasswd user1 7B1safkir
— создаем новый файл .htpasswd, в который добавляем запись для пользователя user1 с паролем, указанным в командной строке.
htpasswd .htpasswd user2
— добавляем в уже существующий файл .htpasswd пользователя user2, а пароль вводим вручную в ответ на соответствующий запрос программы.
После окончания заведения всех логинов файл нужно загрузить на сервер.
Задаем собственные страницы ошибок
Задать собственную страницу ошибок можно следующим образом:
ErrorDocument 404 http://www.domain.ru/404.php
IE игнорирует страницы размером меньше 512 байт.
Индексация директорий и поддиректорий
Чтобы избежать индексации поисковыми системами директорий и поддиректорий, необходимо прописать такую строку, к примеру:
DirectoryIndex index.php
Эта директива задает файл, который будет вызван при обращении к директории без указания имени файла.
Можно указать несколько индексных страниц. При запросе каталога они будут искаться в том порядке, в котором перечислены в директиве DirectoryIndex. Если не будет найден файл index.html, то будет произведен поиск файла index.php и т.д.
DirectoryIndex index.html index.php index.shtml
Лично я предпочитаю переадресовывать с пустых директорий либо на главную страницу сайта, либо на какую-либо другую подходящую страницу. Например, директорию www.domain.ru/pic/ можно переадресовать на www.domain.ru.
Защита изображений от скачивания
Очень часто бывает, что веб-мастера нагло копируют контент с Вашего сайта вместе с рисунками, причем рисунки подгружаются с Вашего же сервера. Это создает лишний трафик, что, зачастую, приводит к ряду проблем. Как же защититься от таких веб-мастеров и не помешать поисковым роботам индексировать изображения? Все просто:
RewriteEngine on RewriteCond %{HTTP_REFERER} . RewriteCond %{HTTP_REFERER} !^http://([^.]+.)?site. [NC] RewriteCond %{HTTP_REFERER} !google. [NC] RewriteCond %{HTTP_REFERER} !search?q=cache [NC] RewriteCond %{HTTP_REFERER} !msn. [NC] RewriteCond %{HTTP_REFERER} !yahoo. [NC] RewriteCond %{REQUEST_URI} !^/image.gif$ RewriteRule .(gif|jpg|png)$ /image.gif [NC,L]
image.gif — изображение, которое будет отображаться, вместо истинных изображений. Рекомендую в этом изображении отобразить Ваш логотип и ссылку на Ваш сайт.
Еще один варинат запрета доступа к картинкам с неразрешенных сайтов:
SetEnvIfNoCase Referer "^$" local_ref=1 SetEnvIfNoCase Referer "^http://(www.)?htmlweb.ru" local_ref=1 SetEnvIfNoCase Referer "^http://(www.)?images.yandex.ru" local_ref=1 SetEnvIfNoCase Referer "^http://(www.)?hghltd.yandex.com" local_ref=1 Order Allow,Deny Allow from env=local_ref
Поисковые машини и разного рода сканеры создают коллосальный трафик на вашем сайте. Нижеприведенный блок кода позволит запретить доступ ботам на сайт.
RewriteCond %{HTTP_USER_AGENT} (Googlebot|Slurp|spider|Twiceler|heritrix| Combine|appie|boitho|e-SocietyRobot|Exabot|Nutch|OmniExplorer| MJ12bot|ZyBorg/1|Ask Jeeves|AskJeeves|ActiveTouristBot| JemmaTheTourist| agadine3|BecomeBot|Clustered-Search-Bot| MSIECrawler|freefind|galaxy|genieknows|INGRID|grub-client| MojeekBot|NaverBot|NetNose-Crawler|OnetSzukaj|PrassoSunner| Asterias Crawler|T-H-U-N-D-E-R-S-T-O-N-E|GeorgeTheTouristBot| VoilaBot|Vagabondo|fantomBro wser|stealthBrowser|cloakBrowser| fantomCrew Browser|Girafabot|Indy Library|Intelliseek|Zealbot| Windows 95|^Mozilla/4.05 [en]$|^Mozilla/4.0$) [NC] RewriteRule ^(.*)$ - [F] # RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^Opera.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^Firefox.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^Netscape.* [NC] RewriteRule ^(.*)$ - [L] RewriteRule ^(.*)$ - [F]
Отслеживание обращений к файлу robots.txt
Чтобы иметь больше информации о посещении поисковиков, полезно иметь подробную информацио об обращении к файлу robots.txt Для того, чтобы оганизовать это, в ‘.htaccess’ должны быть следующие записи:
RewriteEngine on Options +FollowSymlinks RewriteBase / RewriteRule ^robots.txt$ /robot.php?%{REQUEST_URI}
Теперь при запросе файла ‘robots.txt’ наш RewriteRule переадресует посетителя (робота) к обрабатывающему запросы скрипту robot.php. Кроме того, переменная передается скрипту, которая будет обработана в соответствии с вашими нуждами. ‘REQUEST_URI’ определяет имя запрашиваемого файла. В данном примере это — ‘robots.txt’. Скрипт прочтет содержание ‘robots.txt’ и отправит его web-браузеру или роботу поискового сервера. Таким образом, мы можем считать хиты посетителей и вести лог-файлы.
PHPSESSID
Для отключения добавления PHPSESSID к URL вставьте в начало index.php:
ini_set("session.use_trans_sid", 0);
Либо в .htaccess пропишите:
php_flag session.use_trans_sid Off
Директивы кеширования
Кэширование для всех типов файлов по времени доступа
ExpiresActive on ExpiresDefault "access plus 600 seconds"
Кэширование для всех типов файлов по времени изменения
ExpiresActive on ExpiresDefault "modification plus 600 seconds"
Кэширование для определённых типов файлов
ExpiresByType text/css "modification plus 600 seconds" ExpiresByType image/jpeg "modification plus 600 seconds" ExpiresByType image/gif "modification plus 600 seconds" ExpiresByType image/x-ico "modification plus 600 seconds" ExpiresByType image/png "modification plus 600 seconds"
Запрет кеширования с помощью сервера Apache
Откройте файл конфигурации сервера Apache httpd.conf и раскомментируйте следующие строчки:
LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so ... AddModule mod_expires.c AddModule mod_headers.c
Впишите в .htaccess следующее:
# Запрещение кеширования в этой папке # Необходимо включение модулей # mod_headers.c и mod_expires.c # # Заголовок Cache-Control
Header append Cache-Control «no-store, no-cache, must-revalidate»
# Заголовок Expires
ExpiresActive On ExpiresDefault «now»
Необходимые заголовки будут передаваться автоматически, и специально их писать в PHP уже не нужно — кэш уже выключен!
Кеширование с помощью файла .htaccess
# Разрешение кеширования в этой папке # Необходимо включение модулей # mod_headers.c и mod_expires.c # # Заголовок Cache-Control
Header append Cache-Control «public»
# Заголовок Expires
ExpiresActive On ExpiresDefault «access plus 1 hours» #ExpiresDefault «access plus 10 years»
Кеширование javascript файлов с помощью файла .htaccess
ExpiresDefault «access plus 3 days»
Будьте осторожны при кешировании, т.к. при изменении файла, пользователь может получить новый вариант только через 3 дня!
Как заставить html-страницы обрабатывать php-код?
Пропишите в своем файле .htaccess следующие строки:
RemoveHandler .php .htm .html AddHandler application/x-httpd-php .php .htm .html
Как разместить несколько сайтов на одном виртуальном хостинге?
Чтобы разместить два или более сайтов на одном виртуальном хостинге, вопреки отведенному вам тарифным планом количеству доменов необходимо в файле «.htaccess» прописать следующие строки:
RewriteEngine On RewriteRule ^newdirectory/ - [L] RewriteCond %{HTTP_HOST} (www.)?newdomain.ru [NC] RewriteRule (.*) newdirectory/$1 [L]
Где:
newdirectory/ — папка, в которой будет лежать второй сайт
newdomain.ru — домен, для которого мы делаем перенаправление
Обратите внимание, что при этом у Вас будет единый почтовый аккаунт. Т.е. если, у Вас существует ящик admin@domain.ru, то после подключения домена newdomain.ru у ящика admin@domain.ru появляется второе имя — admin@newdomain.ru. А при создании любого нового ящика (например info), ему автоматически присваиваются два имени — info@domain.ru и info@newdomain.ru.
Поиск страниц больше чем в одном каталоге
Иногда необходимо позволить веб-серверу искать страницы больше чем в одном каталоге.
RewriteEngine on # во-первых попытаемся найти это в указанном месте/... # ...и если нашли то заканчиваем поиск: RewriteCond /your/docroot/dir1/%{REQUEST_FILENAME} -f RewriteRule ^(.+) /your/docroot/dir1/$1 [L] # во-вторых - попытаемся найти это в pub/... # ...и если нашли то заканчиваем поиск: RewriteCond /your/docroot/dir2/%{REQUEST_FILENAME} -f RewriteRule ^(.+) /your/docroot/dir2/$1 [L] # иначе продолжаем для других директив RewriteRule ^(.+) - [PT]
Виртуальные хосты пользователей
Если Вы хотите предоставлять адреса www.subdomain.domain.ru для страниц пользователей, Вы можете использовать следующий набор правил для преобразования http://www.subdomain.domain.ru/path во внутренний путь /home/subdomain/path:
RewriteEngine on RewriteCond %{HTTP_HOST} ^www.[^.]+.ru$ RewriteRule ^(.+) %{HTTP_HOST}$1 [C] RewriteRule ^www.([^.]+).ru(.*) /home/$1$2
Повреждаются файлы при загрузке на сервер
Если при передаче файлов через формы (при указанном enctype=»multipart/form-data») бинарные данные повреждаются, пропишите в /cgi-bin/.htaccess директиву:
CharsetRecodeMultipartForms Off.
Ошибка загрузки SWF файлов.
Ошибки при обращении к страницам, содержащим ключевые слова,
типа $_REQUEST
Такое может происходить из-за установленного модуля в Apache. По умолчанию он блокирует в запросах строки с SQL аргументами и другими потенциально опасными командами.
Возможные сообщения об ошибке:
Forbidden
You don’t have permission to access /adm/index.php on this server. Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
или
Запрос небезопасен и был отвергнут.
Добавьте в .htaccess
SecFilterEngine Off SecFilterScanPOST Off
Для сообщения:
«POST /wp-admin/async-upload.php HTTP/1.1» 406 354 «-» «Shockwave Flash»
можно снять защиту только на загрузку файлов на сервер:
SecFilterEngine Off SecFilterScanPOST Off
Оптимально снимать защиту только с той папки, в которой это необходимо, не убирая защиту со всего сайта.
Переменные сервера
Это переменные вида %{NAME_OF_VARIABLE}
где NAME_OF_VARIABLE может быть строкой взятой из следующего списка:
HTTP заголовки: | соединение & запрос: | |
---|---|---|
HTTP_USER_AGENT HTTP_REFERER HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_ACCEPT |
REMOTE_ADDR REMOTE_HOST REMOTE_USER REMOTE_IDENT REQUEST_METHOD SCRIPT_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE |
|
внутренние сервера: | системные: | специальные: |
DOCUMENT_ROOT SERVER_ADMIN SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE |
TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME |
API_VERSION THE_REQUEST REQUEST_URI REQUEST_FILENAME IS_SUBREQ |
Эти переменные полностью соответствуют названным похожим образом MIME-заголовкам HTTP, и переменным сервера Apache или полям struct tm
систем Unix. Те, что являются для mod_rewrite специальными включают:
IS_SUBREQ — Будет содержать текст «true» если запрос выполняется в текущий момент как подзапрос, «false» в другом случае. Подзапросы могут быть сгенерированны модулями которым нужно иметь дело с дополнительными файлами или URI для того чтобы выполнить собственные задачи.
API_VERSION — Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h. API версия модуля соответствует используемой версии Apache (для версии Apache 1.3.14, к примеру это 19990320:10), однако это в основном интересно авторам модулей.
THE_REQUEST — Полная строка HTTP запроса отправленная браузером серверу (т.е., «GET /index.html HTTP/1.1
»). Она не включает какие-либо дополнительные заголовки отправляемые браузером.
REQUEST_URI — Ресурс, запрошенный в строке HTTP запроса.
REQUEST_FILENAME — Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу.
Примечания:
- Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одинаковые значения, т.е., значение поля
filename
внутренней структурыrequest_rec
сервера Apache. Первое имя это просто широко известное имя переменной CGI в то время как второе это постоянная копия REQUEST_URI (содержащая значение поляuri
структурыrequest_rec
). - Есть специальный формат:
%{ENV:переменная}
где переменная может быть любой переменной окружения. Это ищется во внутренних структурах Apache и (если там нет) с помощью вызоваgetenv()
из процесса Apache сервера. - Есть специальный формат:
%{HTTP:заголовок}
где заголовок может быть любым именем HTTP MIME-заголовка. Это ищется в HTTP запросе. Пример:%{HTTP:Proxy-Connection}
значение HTTP заголовка «Proxy-Connection:
». - Есть специальный формат
%{LA-U:переменная}
опережающих запросов которые производятся внутренним (основанном на URL) подзапросом для определения конечного значения переменной. Используйте это когда вы хотите использовать переменную для преобразований, которая реально определяется позднее, в какой-либо фазе API, и таким образом недоступна на данном этапе. Для примера когда вы хотите преобразовать соответственно переменнойREMOTE_USER
из контекста сервера (файлhttpd.conf
) вы должны использовать%{LA-U:REMOTE_USER}
потому что эта переменная устанавливается в фазах авторизации которые идут после фазы трансляции URL в которой и работает mod_rewrite. С другой стороны, по причине реализации работы mod_rewrite в контексте каталога (файл .htaccess) через Fixup фазу API и из-за того, фазы авторизации идут до этой фазы, вы просто можете там использовать%{REMOTE_USER}
. - Есть специальный формат:
%{LA-F:переменная}
который создает внутренний (основанный на имени файла) подзапрос для определения конечного значения переменной. В основном это то же самое что и формат LA-U приведенный выше.