Директивы .htaccess

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

Не уверены, какие включить — соберите .htaccess чекбоксами в генераторе или возьмите готовый блок в рецептах; проверить файл — линтер /check/; как работает mod_rewrite — туториал; разобрать конкретный файл построчно — объяснялка; перевести старый синтаксис контроля доступа на Apache 2.4 — конвертер; не знаете термин — глоссарий .htaccess. Часть директив в .htaccess доступна, только если хостинг разрешил это в AllowOverride — иначе будет ошибка 500.

core — ядро Apache

Базовые директивы ядра, влияющие на поведение каталога.

  • ErrorDocument — что отдавать при ошибке с указанным HTTP-кодом: путь к файлу на сайте, полный URL или текст-сообщение в кавычках. Синтаксис: ErrorDocument <код> <путь|URL|"текст">. Пример: ErrorDocument 404 /404.html. (В Apache 2.4 текст-сообщение обязан быть в парных кавычках; полный внешний URL превращает ответ в редирект.)
  • Options — фичи каталога: Indexes (автолистинг), FollowSymLinks / SymLinksIfOwnerMatch, MultiViews, ExecCGI, Includes / IncludesNOEXEC. +/- добавляют/убирают; голое имя задаёт набор целиком. Синтаксис: Options [+|-]<опция> …. Пример: Options -Indexes +FollowSymLinks. (Если хостинг не разрешил Options через AllowOverride Options — будет ошибка 500.)
  • FileETag — из чего формировать заголовок ETag: INode, MTime, Size, All, None. Синтаксис: FileETag <компоненты>. Пример: FileETag MTime Size / FileETag None (отключить ETag).
  • AddDefaultCharset — добавлять charset= в Content-Type для text/plain и text/html, если не указан. Синтаксис: AddDefaultCharset <кодировка|Off>. Пример: AddDefaultCharset UTF-8.
  • ServerSignature — выводить ли строку с версией сервера на серверных страницах (ошибки, листинг). Синтаксис: ServerSignature On|Off|EMail. Пример: ServerSignature Off.
  • AcceptPathInfo — принимать ли «лишний» путь после имени файла (/script.php/extra). Синтаксис: AcceptPathInfo On|Off|Default. Пример: AcceptPathInfo Off.
  • LimitRequestBody — максимальный размер тела запроса (загрузки файлов) в байтах; 0 — без лимита. Синтаксис: LimitRequestBody <байты>. Пример: LimitRequestBody 10485760 (10 МБ).
  • ForceType — принудительно задать Content-Type всем файлам в каталоге/секции. Синтаксис: ForceType <mime-тип|None>. Пример: ForceType application/octet-stream (внутри <FilesMatch> — заставить браузер скачивать).
  • SetHandler — назначить обработчик всем совпавшим файлам/URL. Синтаксис: SetHandler <обработчик|None>. Пример: <Files "server-status"> SetHandler server-status </Files>.
  • ContentDigest — добавлять заголовок Content-MD5. Синтаксис: ContentDigest On|Off. Пример: ContentDigest Off. (Используется редко, заметно нагружает сервер.)

В .htaccess нельзя: <Directory>, <DirectoryMatch>, <Location>, <LocationMatch>, <VirtualHost>, <Proxy>, ServerName, DocumentRoot, Listen, LoadModule — только в конфиге сервера/vhost.

Что делать, если .htaccess уже выдал 500 (и как понять, какая директива виновата), — гид «Почему .htaccess не работает».

mod_rewrite — переписывание URL

Гибкая трансформация URL «на лету» (ЧПУ, редиректы, склейка зеркал, блокировки). Полный разбор синтаксиса и поведения — в туториале «Как работает mod_rewrite»; синтаксис регулярных выражений в паттернах — справочник «PCRE для mod_rewrite»; здесь — краткая справка.

  • RewriteEngine — включить/выключить обработку rewrite-правил. Синтаксис: RewriteEngine On|Off. Пример: RewriteEngine On. (Без On все RewriteRule/RewriteCond игнорируются.)
  • RewriteBase — URL-префикс для относительных подстановок в .htaccess подкаталога. Синтаксис: RewriteBase <URL-путь>. Пример: RewriteBase /app/. (Не нужна в корневом .htaccess и при абсолютных подстановках.)
  • RewriteCond — условие, проверяемое перед ближайшим следующим RewriteRule. Синтаксис: RewriteCond <ТестоваяСтрока> <ШаблонУсловия> [флаги]. Пример: RewriteCond %{REQUEST_FILENAME} !-f. (Несколько подряд — логическое И; флаг [OR] — ИЛИ со следующим.)
  • RewriteRule — правило переписывания. Синтаксис: RewriteRule <Паттерн> <Подстановка> [Флаги]. Пример: RewriteRule ^old-page$ /new-page [R=301,L].
  • RewriteOptions — опции движка для контекста: Inherit (наследовать правила родителя), InheritDown / InheritDownBefore (передать свои правила вниз), AllowNoSlash, IgnoreInherit. Синтаксис: RewriteOptions <опция> …. Пример: RewriteOptions Inherit.

В .htaccess нельзя: RewriteMap — только в конфиге сервера/vhost.

Частые флаги RewriteRuleRewriteCond):

  • L — стоп обработки правил в этом проходе. (В .htaccess Apache 2.4 после перезаписи перезапускает набор правил с начала — для окончательного «стоп» используйте END.)
  • END — окончательно остановить обработку, набор не перезапускать (Apache 2.4+).
  • R=код — внешний редирект; без значения — 302; для постоянного — R=301.
  • NC — без учёта регистра.
  • QSA — присоединить исходную строку запроса к новой; QSD — отбросить строку запроса (2.4+).
  • F — вернуть 403 Forbidden; G — вернуть 410 Gone (подстановку обычно пишут -).
  • C / chain — следующее правило выполнится, только если это сработало.
  • S=N / skip=N — при срабатывании пропустить N следующих правил.
  • NE — не URL-кодировать спецсимволы в подстановке.
  • E=ИМЯ:ЗНАЧЕНИЕ — выставить переменную окружения.
  • [OR] (только RewriteCond) — ИЛИ-связь со следующим условием.
  • (прочие — N, P, NS, T=, B, DPI, PT, H= — реже; см. туториал.)

Частые переменные %{…}:

  • HTTP_HOST / SERVER_NAME — хост из запроса (example.com).
  • HTTPSon, если запрос по HTTPS, иначе off (за прокси/CDN может быть всегда off — смотрите %{HTTP:X-Forwarded-Proto}).
  • REQUEST_SCHEMEhttp / https. SERVER_PORT — порт.
  • REQUEST_URI — путь запроса (/blog/5), без строки запроса; меняется при внутренней перезаписи.
  • QUERY_STRING — то, что после ? (без ?).
  • REQUEST_METHODGET / POST / HEAD / …
  • REQUEST_FILENAME / SCRIPT_FILENAME — полный путь к файлу на диске для этого запроса (используется в проверках -f / -d).
  • DOCUMENT_ROOT — корневой каталог сайта на диске.
  • THE_REQUEST — полная первая строка запроса (GET /blog/5?x=1 HTTP/1.1); не меняется при внутренних перезаписях — поэтому используется в правилах-редиректах, чтобы не зациклиться.
  • HTTP_USER_AGENT — User-Agent клиента; HTTP_REFERER — заголовок Referer; HTTP_COOKIE — Cookie.
  • HTTP:Имя-Заголовка — любой входящий HTTP-заголовок (%{HTTP:X-Forwarded-Proto}, %{HTTP:Accept-Language}).
  • ENV:ИМЯ — переменная окружения (например, выставленная [E=…] или SetEnvIf).
  • REMOTE_ADDR — IP-адрес клиента.
  • TIME / TIME_YEAR / TIME_MON / TIME_DAY / TIME_HOUR / TIME_MIN / TIME_SEC / TIME_WDAY — текущее время сервера.
  • IS_SUBREQtrue, если это внутренний под-запрос.
  • (полный список и поведение — в туториале «Как работает mod_rewrite».)

mod_alias — простые редиректы и алиасы

Простые редиректы по точному пути/префиксу или по regex — не требуют RewriteEngine.

  • Redirect — внешний редирект по точному пути (или префиксу — тогда хвост дописывается к новому адресу). Синтаксис: Redirect [код] <старый-путь> <новый-путь-или-URL> (код: permanent/301, temp/302 (по умолч.), seeother/303, gone/410 — без второго аргумента). Пример: Redirect 301 /old-page.html /new-page.html.
  • RedirectMatch — то же по регулярному выражению, с бэкрефами $1. Синтаксис: RedirectMatch [код] <regex> <замена>. Пример: RedirectMatch 301 ^/old-section/(.*)$ /new-section/$1.
  • RedirectPermanent — сокращение для Redirect 301. Синтаксис: RedirectPermanent <старый> <новый>. Пример: RedirectPermanent /old /new.
  • RedirectTemp — сокращение для Redirect 302. Синтаксис: RedirectTemp <старый> <новый>. Пример: RedirectTemp /shop /coming-soon.

В .htaccess нельзя: Alias, AliasMatch, ScriptAlias, ScriptAliasMatch. Много 301-редиректов из списка — пакетный генератор.

mod_headers — HTTP-заголовки

Добавление, изменение и удаление HTTP-заголовков ответа и запроса.

  • Header — заголовок ответа. Действия: set (установить, заменив), always set (даже для ошибок/редиректов), append, add, unset, edit / edit* (regex-замена значения), merge. Можно условие env=ИМЯ / expr=…. Синтаксис: Header [always] <действие> <Имя> ["значение"] [env=…]. Пример: Header always set X-Frame-Options "SAMEORIGIN" / Header unset X-Powered-By. (Заголовки безопасности — генератор (блок security headers), рецепты.)
  • RequestHeader — заголовок запроса (который увидит бэкенд/прокси/CGI). Синтаксис: RequestHeader <действие> <Имя> ["значение"]. Пример: RequestHeader set X-Forwarded-Proto "https".

Полный разбор HTTP-заголовков, которые ставят через Header set (безопасность — CSP, HSTS, X-Frame-Options; CORS; кэш; прочее) — справочник HTTP-заголовков.

mod_expires — заголовки кэширования

Генерация заголовков Expires и Cache-Control: max-age — насколько долго браузер/прокси может кэшировать ответ.

  • ExpiresActive — включить генерацию этих заголовков. Синтаксис: ExpiresActive On|Off. Пример: ExpiresActive On.
  • ExpiresByType — срок кэша для конкретного MIME-типа. Синтаксис: ExpiresByType <mime> "<base> plus <N> <units>" (base: access (с момента запроса) / modification (с даты файла); units: seconds/minutes/hours/days/weeks/months/years). Пример: ExpiresByType image/png "access plus 1 year".
  • ExpiresDefault — срок кэша по умолчанию для всего остального. Синтаксис: ExpiresDefault "<base> plus <N> <units>". Пример: ExpiresDefault "access plus 1 month". (Кэш статики — рецепт, генератор.)

Когда и насколько долго кэшировать, чем кэш в браузере отличается от gzip — собрано в гиде «Ускорение сайта через .htaccess».

mod_deflate / mod_filter / mod_mime — сжатие и фильтры вывода

Сжатие ответов (GZIP/Brotli) и другие фильтры на выводе.

  • AddOutputFilterByType — применить выходной фильтр к ответам указанных MIME-типов. Синтаксис: AddOutputFilterByType <ФИЛЬТР> <mime> …. Пример: AddOutputFilterByType DEFLATE text/html text/css application/javascript. (Для Brotli — BROTLI_COMPRESS (если на хостинге есть mod_brotli); формально директива помечена устаревшей с Apache 2.3.7 в пользу <FilesMatch> + SetOutputFilter, но по-прежнему широко используется и работает.)
  • SetOutputFilter — применить выходной фильтр ко всем файлам в каталоге/секции. Синтаксис: SetOutputFilter <ФИЛЬТР>. Пример: <FilesMatch "\.(html|css|js)$"> SetOutputFilter DEFLATE </FilesMatch>.
  • AddOutputFilter — применить фильтр по расширению файла. Синтаксис: AddOutputFilter <ФИЛЬТР> <.ext> …. Пример: AddOutputFilter INCLUDES .shtml.
  • RemoveOutputFilter — снять привязку фильтра к расширению (для подкаталога). Синтаксис: RemoveOutputFilter <.ext> …. Пример: RemoveOutputFilter .shtml. (GZIP — рецепт, генератор.)

Как настроить сжатие правильно (что сжимать, что нет, gzip vs Brotli) — в гиде «Ускорение сайта через .htaccess».

mod_mime — типы, обработчики, кодировки

Сопоставление расширений файлов с MIME-типами, обработчиками, кодировками и языками.

  • AddType — связать MIME-тип с расширением(ями). Синтаксис: AddType <mime> <.ext> …. Пример: AddType application/font-woff2 .woff2.
  • AddHandler — связать обработчик с расширением. Синтаксис: AddHandler <handler> <.ext> …. Пример: AddHandler application/x-httpd-php .php .phtml.
  • AddEncoding — пометить расширение как контент с указанным Content-Encoding. Синтаксис: AddEncoding <encoding> <.ext> …. Пример: AddEncoding gzip .gz.
  • AddCharset — связать кодировку с расширением. Синтаксис: AddCharset <charset> <.ext> …. Пример: AddCharset UTF-8 .utf8.
  • AddLanguage — связать язык с расширением (для негоциации MultiViews). Синтаксис: AddLanguage <lang> <.ext> …. Пример: AddLanguage ru .ru.
  • DefaultLanguage — язык по умолчанию для файлов без .lang-расширения. Синтаксис: DefaultLanguage <lang>. Пример: DefaultLanguage ru.
  • RemoveType / RemoveHandler / RemoveEncoding / RemoveCharset / RemoveLanguage — снять привязку, унаследованную от родителя, для этого каталога. Синтаксис: RemoveHandler <.ext> …. Пример: RemoveHandler .html .htm (отдавать .html как статику, не как обработчик).
  • MultiviewsMatch — какие расширения учитывать при MultiViews. Синтаксис: MultiviewsMatch <Any|NegotiatedOnly|Filters|Handlers …>. Пример: MultiviewsMatch Any.
  • ModMimeUsePathInfo — учитывать ли PATH_INFO при определении типа/обработчика. Синтаксис: ModMimeUsePathInfo On|Off. Пример: ModMimeUsePathInfo On. (Редко.)

mod_dir — индексные страницы каталога

Что отдавать при заходе на каталог; запасной ресурс.

  • DirectoryIndex — список файлов, которые отдавать при запросе каталога (/ или /dir/); берётся первый существующий слева направо. Синтаксис: DirectoryIndex <файл> … (или disabled — отключить). Пример: DirectoryIndex index.php index.html home.html.
  • DirectorySlash — добавлять ли автоматически слэш в конец URL каталога (редирект /dir/dir/). Синтаксис: DirectorySlash On|Off. Пример: DirectorySlash Off. (Отключение требует осторожности — могут сломаться относительные ссылки и листинг каталога.)
  • FallbackResource — что отдавать, если запрошенного файла/каталога нет (простая альтернатива фронт-контроллеру на mod_rewrite). Синтаксис: FallbackResource <URL-путь> (или disabled). Пример: FallbackResource /index.php.
  • DirectoryIndexRedirect — отдавать ли HTTP-редирект на индексный файл вместо внутренней отдачи. Синтаксис: DirectoryIndexRedirect On|Off|<код>. Пример: DirectoryIndexRedirect 301. (Apache 2.5/trunk — на стабильном 2.4 может отсутствовать.)

mod_autoindex — листинг каталога (если включён)

Внешний вид автоматического списка файлов — имеет смысл, только если включён Options +Indexes (что обычно наоборот отключают).

  • IndexOptions — настройки листинга: FancyIndexing, HTMLTable, SuppressDescription, SuppressHTMLPreamble, IconsAreLinks, NameWidth=*, DescriptionWidth=*, IgnoreCase, ShowForbidden, VersionSort, … Синтаксис: IndexOptions [+|-]<опция> …. Пример: IndexOptions FancyIndexing HTMLTable NameWidth=* IgnoreCase.
  • IndexIgnore — файлы/маски, не показываемые в листинге. Синтаксис: IndexIgnore <маска> …. Пример: IndexIgnore .htaccess .git *.bak *~ HEADER.* README.*.
  • IndexOrderDefault — сортировка по умолчанию: Ascending|Descending Name|Date|Size|Description. Синтаксис: IndexOrderDefault <направление> <ключ>. Пример: IndexOrderDefault Descending Date.
  • HeaderName / ReadmeName — файл, вставляемый в начало / конец листинга. Синтаксис: HeaderName <файл> / ReadmeName <файл>. Пример: HeaderName HEADER.html / ReadmeName README.html.
  • AddIcon / AddIconByType / AddIconByEncoding — иконка для файла/имени / MIME-типа / кодировки. Синтаксис: AddIconByType <иконка> <mime-маска> …. Пример: AddIconByType (TXT,/icons/text.gif) text/*.
  • AddDescription — текстовое описание для файла/маски в листинге. Синтаксис: AddDescription "<текст>" <маска> …. Пример: AddDescription "Архив проекта" *.zip.

mod_negotiation — согласование контента (MultiViews)

Выбор варианта файла по заголовкам Accept-* клиента (язык, тип) — pagepage.ru.html / page.en.html.

  • Options +MultiViews — включить согласование. Синтаксис: Options +MultiViews. Пример: Options +MultiViews.
  • LanguagePriority — приоритет языков, если клиент не выразил предпочтений. Синтаксис: LanguagePriority <lang> …. Пример: LanguagePriority ru en.
  • ForceLanguagePriority — поведение при неоднозначности/отсутствии совпадения: None / Prefer / Fallback. Синтаксис: ForceLanguagePriority <режим> …. Пример: ForceLanguagePriority Prefer Fallback.
  • CacheNegotiatedDocs — разрешать ли прокси кэшировать результат согласования. Синтаксис: CacheNegotiatedDocs On|Off. Пример: CacheNegotiatedDocs Off. (Редко.)

mod_setenvif — переменные по признакам запроса

Выставить переменную окружения, если атрибут запроса (заголовок, IP, URI, метод) совпал с регулярным выражением.

  • SetEnvIf — выставить переменную при совпадении атрибута запроса с regex. Атрибут: имя HTTP-заголовка либо Remote_Addr / Remote_Host / Server_Addr / Request_Method / Request_Protocol / Request_URI / имя уже выставленной переменной. Синтаксис: SetEnvIf <атрибут> <regex> <ИМЯ>[=значение] …. Пример: SetEnvIf Request_URI "\.(jpg|png|gif)$" is_image=1.
  • SetEnvIfNoCase — то же, без учёта регистра. Синтаксис: SetEnvIfNoCase <атрибут> <regex> <ИМЯ>[=значение]. Пример: SetEnvIfNoCase User-Agent "(AhrefsBot|SemrushBot)" bad_bot=1.
  • SetEnvIfExpr — выставить переменную, если выражение expr истинно. Синтаксис: SetEnvIfExpr "<expr>" <ИМЯ>[=значение]. Пример: SetEnvIfExpr "%{HTTP_HOST} == 'example.com'" canonical=1.
  • BrowserMatch / BrowserMatchNoCase — сокращение для SetEnvIf User-Agent …. Синтаксис: BrowserMatch <regex> <ИМЯ>[=значение]. Пример: BrowserMatchNoCase "MSIE [1-9]\b" old_browser=1.

mod_env — переменные окружения

Задание/проброс/удаление переменных окружения (видны как %{ENV:…}, в CGI/PHP — в $_SERVER).

  • SetEnv — задать переменную окружения с фиксированным значением. Синтаксис: SetEnv <ИМЯ> <значение>. Пример: SetEnv APP_ENV production.
  • UnsetEnv — удалить переменную окружения. Синтаксис: UnsetEnv <ИМЯ> …. Пример: UnsetEnv HTTP_PROXY (защита от уязвимости «httpoxy»).
  • PassEnv — пробросить переменную из окружения, в котором запущен сервер. Синтаксис: PassEnv <ИМЯ> …. Пример: PassEnv LANG TZ.

mod_auth* — аутентификация (Basic / Digest)

Закрытие каталога логином-паролем (HTTP Basic/Digest auth).

  • AuthType — тип аутентификации. Синтаксис: AuthType Basic|Digest|None. Пример: AuthType Basic.
  • AuthName — название «зоны» (показывается в окне ввода пароля). Синтаксис: AuthName "<текст>". Пример: AuthName "Закрытая зона".
  • AuthBasicProvider — источник пользователей: file (по умолч.), dbm, dbd, ldap, socache. Синтаксис: AuthBasicProvider <provider> …. Пример: AuthBasicProvider file.
  • AuthUserFile — путь к файлу .htpasswd (строки логин:хеш). Синтаксис: AuthUserFile <абсолютный-путь>. Пример: AuthUserFile "/srv/site/.htpasswd". (Путь абсолютный; файл лучше держать вне DocumentRoot; сгенерировать его и блок авторизации — /htpasswd/.)
  • AuthGroupFile — путь к файлу групп (строки группа: user1 user2). Синтаксис: AuthGroupFile <абсолютный-путь>. Пример: AuthGroupFile "/srv/site/.htgroup".
  • Require (mod_authz_core) — кому разрешён доступ: valid-user (любой из файла), user alice bob, group admins, ip 203.0.113.0/24, host example.com, all granted, all denied, not <…>, expr "<…>". Синтаксис: Require <условие>. Пример: Require valid-user / Require ip 203.0.113.0/24. <RequireAll> / <RequireAny> / <RequireNone> условия комбинируются (И/ИЛИ/НИ ОДНОГО).)
  • AuthMerging — как объединять Require-правила родителя и потомка: Off (потомок заменяет), And, Or. Синтаксис: AuthMerging Off|And|Or. Пример: AuthMerging And.
  • Кратко про digest: AuthType Digest, AuthDigestProvider file, AuthDigestDomain "/admin/" — используется редко (Basic + HTTPS обычно достаточно).

Подробнее про парольную защиту — статья «Парольная защита», генератор .htpasswd/htpasswd/.

mod_access_compat — контроль доступа Apache 2.2 (устаревшее)

Старый синтаксис ограничения доступа (Apache 2.2). В 2.4 заменён на Require — конвертер /apache24/.

  • Order — порядок применения Allow/Deny: Allow,Deny (по умолчанию запрет — пускаем только явно разрешённых) или Deny,Allow (по умолчанию разрешено — блокируем только явно запрещённых). Синтаксис: Order Allow,Deny | Deny,Allow. Пример: Order Deny,Allow. (Убрано в Apache 2.4 (модуль mod_access_compat для совместимости); правильно — Require.)
  • Allow from — разрешить доступ перечисленным: IP / подсеть (203.0.113.0/24) / домен / all / env=ИМЯ. Синтаксис: Allow from <…> …. Пример: Allow from 203.0.113.0/24. (Apache 2.4 → Require ip 203.0.113.0/24.)
  • Deny from — запретить доступ перечисленным. Синтаксис: Deny from <…> …. Пример: Deny from all. (Apache 2.4 → Require all denied / Require not ip ….)
  • Satisfy — при одновременном наличии аутентификации (Require valid-user) и контроля доступа (Allow/Deny): All (нужно и то, и другое) / Any (достаточно одного). Синтаксис: Satisfy All|Any. Пример: Satisfy Any. (Убрано в Apache 2.4 — используйте <RequireAll> / <RequireAny>.)

Какие из этих директив реально нужны для защиты сайта (и в какой комбинации) — собрано в гид «Безопасность сайта через .htaccess».

Блокировка по IP подробнее — статья «Фильтрация по IP»; перевести Order/Allow/Deny/Satisfy на синтаксис 2.4 — конвертер.

mod_php — настройки PHP (только mod_php)

Установка php.ini-параметров из .htaccess — работает только с серверным модулем mod_php.

  • php_value — задать значение настройки php.ini уровня PHP_INI_ALL / PHP_INI_USER / PHP_INI_PERDIR. Синтаксис: php_value <имя> <значение>. Пример: php_value upload_max_filesize 32M.
  • php_flag — то же для булевых настроек (On/Off). Синтаксис: php_flag <имя> On|Off. Пример: php_flag display_errors Off.
  • php_admin_value / php_admin_flag — то же, но с приоритетом «admin» (нельзя переопределить из скрипта через ini_set()). Синтаксис: php_admin_value <имя> <значение>. Пример: php_admin_value open_basedir "/srv/site/".

На PHP-FPM или CGI этих директив в .htaccess быть не должно — Apache вернёт 500 Internal Server Error. Для FPM используйте файл .user.ini рядом со скриптами (для PHP_INI_USER/PHP_INI_PERDIR-настроек) или конфигурацию пула FPM. Подробнее — рецепты.

контейнеры (секции конфигурации)

Блочные директивы, ограничивающие область действия вложенных директив.

  • <Files "имя"> / <FilesMatch "regex"> — применить вложенные директивы к файлам с таким именем / именем по регулярке (в этом каталоге и ниже). Синтаксис: <Files "secret.txt"> … </Files> / <FilesMatch "\.(env|log|sql)$"> … </FilesMatch>. Пример: <FilesMatch "\.env$"> Require all denied </FilesMatch>.
  • <If "expr"> / <ElseIf "expr"> / <Else> — применить вложенные директивы, если выражение expr истинно (Apache 2.4). Синтаксис: <If "%{HTTP_HOST} == 'example.com'"> … </If>. Пример: <If "%{REQUEST_METHOD} == 'POST'"> Header set X-Method "post" </If>.
  • <IfModule [!]mod_xxx.c> — применить вложенные директивы, только если (с ! — если не) загружен модуль. Синтаксис: <IfModule mod_rewrite.c> … </IfModule>. Пример: <IfModule mod_expires.c> ExpiresActive On </IfModule>. (Полезно, чтобы .htaccess не падал с 500, когда модуля нет на хостинге.)
  • <IfVersion "<оператор> <версия>"> — применить, если версия Apache попадает под условие (модуль mod_version; на большинстве хостингов есть). Синтаксис: <IfVersion >= 2.4> … </IfVersion> (операторы: =, <, >, <=, >=, ~ (regex)). Пример: <IfVersion < 2.4> Order Allow,Deny; Allow from all </IfVersion>.
  • <RequireAll> / <RequireAny> / <RequireNone> — группировка Require-условий: пройти все / любое / ни одного (Apache 2.4, mod_authz_core). Синтаксис: <RequireAll> Require all granted; Require not ip 203.0.113.5 </RequireAll>. Пример: тот же — «пускать всех, кроме 203.0.113.5».
  • <Limit GET POST> / <LimitExcept GET POST> — применить вложенные директивы доступа только к указанным HTTP-методам / ко всем, кроме указанных. Синтаксис: <LimitExcept GET POST HEAD> Require valid-user </LimitExcept>. Пример: тот же. (Внутри — только директивы контроля доступа (Require / Order / Allow / Deny); по возможности используйте <LimitExcept> (закрыть всё, кроме нужного), а не <Limit>.)

В .htaccess нельзя: <Directory>, <DirectoryMatch>, <Location>, <LocationMatch>, <VirtualHost>, <Proxy>, <ProxyMatch> — они работают только в конфиге сервера/vhost.

Краткая выжимка самых частых строк — шпаргалка по .htaccess.

Проверка .htaccess (линтер) · Генератор .htaccess · Пакетный генератор 301-редиректов · Генератор .htpasswd · Конвертер Apache 2.2 → 2.4 · Тестер RewriteRule · Рецепты .htaccess · Как работает mod_rewrite · Фильтрация по IP · Парольная защита · Блокировка по referer