Шпаргалка .htaccess

Одна страница — самые нужные строки и блоки .htaccess с кнопкой «Скопировать». Минимум текста, максимум готового кода.

За подробностями — справочник директив, готовые рецепты в cookbook, генератор из чекбоксов — генератор. Собрать файл из блоков — конструктор .htaccess.

1. Скелет .htaccess

Включить mod_rewrite
.htaccessкопировать
RewriteEngine On
# Если сайт в подкаталоге — раскомментируйте и поправьте:
# RewriteBase /subdir/
Подключить модуль только если загружен
.htaccessкопировать
<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
</IfModule>

2. Редиректы

HTTP → HTTPS
.htaccessкопировать
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
HTTPS за прокси / CDN
.htaccessкопировать
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
www → без www
.htaccessкопировать
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
Без www → www
.htaccessкопировать
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Redirect одной страницы
.htaccessкопировать
Redirect 301 /old /new
RewriteRule одной страницы
.htaccessкопировать
RewriteEngine On
RewriteRule ^old\.html$ /new [R=301,L]
Редирект раздела
.htaccessкопировать
RedirectMatch 301 ^/old/(.*)$ /new/$1
Редирект на новый домен
.htaccessкопировать
RewriteEngine On
RewriteRule ^(.*)$ https://new.ru/$1 [R=301,L]
Добавить завершающий слэш
.htaccessкопировать
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]
410 Gone (страница удалена навсегда)
.htaccessкопировать
RewriteEngine On
RewriteRule ^old$ - [G]

3. Доступ и защита

Выключить листинг каталога
.htaccessкопировать
Options -Indexes
Защитить .ht-файлы
.htaccessкопировать
<Files ~ "^\.ht">
    Require all denied
</Files>
Запретить опасные файлы (.env / .sql / .bak)
.htaccessкопировать
<FilesMatch "\.(env|sql|bak|log|old|orig)$">
    Require all denied
</FilesMatch>
Доступ только с конкретного IP
.htaccessкопировать
Require ip 1.2.3.4
Парольная защита (Basic Auth)
.htaccessкопировать
AuthType Basic
AuthName "Закрытая зона"
AuthUserFile /srv/site/.htpasswd
Require valid-user
Запрет PHP в папке загрузок
.htaccessкопировать
<FilesMatch "\.ph(p[0-9]?|tml)$">
    Require all denied
</FilesMatch>

4. Страницы ошибок

Страницы ошибок
.htaccessкопировать
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html
ErrorDocument 500 /500.html
Режим обслуживания — 503 для всех кроме своего IP
.htaccessкопировать
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !=1.2.3.4
RewriteCond %{REQUEST_URI} !^/maintenance\.html$ [NC]
RewriteRule .* - [R=503,L]
ErrorDocument 503 /maintenance.html
<IfModule mod_headers.c>
    Header always set Retry-After "3600"
</IfModule>

5. Производительность

Gzip (сжатие текстовых ответов)
.htaccessкопировать
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json image/svg+xml
</IfModule>
Кэш статики (mod_expires)
.htaccessкопировать
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType text/css "access plus 1 year"
    ExpiresByType text/html "access plus 0 seconds"
</IfModule>
Cache-Control для хешированных ассетов
.htaccessкопировать
<IfModule mod_headers.c>
    <FilesMatch "\.(css|js|png|jpg|woff2)$">
        Header set Cache-Control "public, max-age=31536000, immutable"
    </FilesMatch>
</IfModule>
Убрать ETag
.htaccessкопировать
FileETag None

Подробнее: оптимизация .htaccess · гид по производительности.

6. Заголовки безопасности

Заголовки безопасности
.htaccessкопировать
<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always unset X-Powered-By
</IfModule>
CORS (разрешить конкретный origin)
.htaccessкопировать
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "https://example.com"
</IfModule>

Справочник всех заголовков: /headers/.

7. Чистые URL / фронт-контроллер

Фронт-контроллер (Laravel, Symfony, WordPress, любой MVC)
.htaccessкопировать
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L,QSA]
Убрать расширение .php из URL
.htaccessкопировать
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^.]+)$ $1.php [L]
Убрать index.php из URL (301 — чтобы не было дублей)
.htaccessкопировать
RewriteEngine On
RewriteCond %{THE_REQUEST} \s/+index\.php[\s?] [NC]
RewriteRule ^index\.php$ / [R=301,L]

8. Синтаксис mod_rewrite

Флаги RewriteRule и RewriteCond

RewriteRule ПАТТЕРН ПОДСТАНОВКА [ФЛАГИ] — путь в паттерне без ведущего /.

  • L — последнее правило в этом проходе
  • R=301 / R=302 — постоянный / временный редирект
  • QSA — добавить исходный query-string к подстановке
  • NC — без учёта регистра
  • F — вернуть 403 Forbidden
  • G — вернуть 410 Gone
  • END — полная остановка (не только текущий проход)
  • S=N — пропустить следующие N правил
  • NE — не кодировать спецсимволы в подстановке
  • P — проксировать запрос (mod_proxy)

RewriteCond %{ПЕРЕМЕННАЯ} ПАТТЕРН [NC,OR] — действует только на ближайший следующий RewriteRule. Флаг OR — объединить несколько RewriteCond оператором «ИЛИ» (по умолчанию — «И»).

  • Бэкрефы из паттерна RewriteRule: $1$9
  • Бэкрефы из последнего RewriteCond: %1%9

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

Переменные mod_rewrite
  • %{HTTP_HOST} — хост из запроса (например example.com)
  • %{REQUEST_URI} — путь без query-string (например /page/)
  • %{QUERY_STRING} — строка запроса после ?
  • %{HTTPS}on если HTTPS, off иначе
  • %{REQUEST_METHOD} — HTTP-метод (GET, POST…)
  • %{REMOTE_ADDR} — IP-адрес клиента
  • %{HTTP_USER_AGENT} — строка User-Agent
  • %{HTTP_REFERER} — заголовок Referer
  • %{REQUEST_FILENAME} — полный путь к файлу на диске
  • %{THE_REQUEST} — вся первая строка запроса (напр. GET /page.php HTTP/1.1) — используют для защиты от редирект-петель
  • %{HTTP:X-Forwarded-Proto} — значение произвольного заголовка запроса (за прокси)
  • %{ENV:VAR} — переменная окружения
  • %{DOCUMENT_ROOT} — корень сайта на диске
  • %{SERVER_NAME} — имя сервера из конфига Apache
  • %{TIME} / %{TIME_HOUR} — текущее время (для time-based правил)