Шпаргалка .htaccess
Одна страница — самые нужные строки и блоки .htaccess с кнопкой «Скопировать». Минимум текста, максимум готового кода.
За подробностями — справочник директив, готовые рецепты в cookbook, генератор из чекбоксов — генератор. Собрать файл из блоков — конструктор .htaccess.
1. Скелет .htaccess
Включить mod_rewrite
RewriteEngine On # Если сайт в подкаталоге — раскомментируйте и поправьте: # RewriteBase /subdir/
Подключить модуль только если загружен
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" </IfModule>
2. Редиректы
HTTP → HTTPS
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
HTTPS за прокси / CDN
RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
www → без www
RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
Без www → www
RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Redirect одной страницы
Redirect 301 /old /newRewriteRule одной страницы
RewriteEngine On RewriteRule ^old\.html$ /new [R=301,L]
Редирект раздела
RedirectMatch 301 ^/old/(.*)$ /new/$1Редирект на новый домен
RewriteEngine On RewriteRule ^(.*)$ https://new.ru/$1 [R=301,L]
Добавить завершающий слэш
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*[^/])$ /$1/ [R=301,L]
410 Gone (страница удалена навсегда)
RewriteEngine On RewriteRule ^old$ - [G]
3. Доступ и защита
Выключить листинг каталога
Options -IndexesЗащитить .ht-файлы
<Files ~ "^\.ht"> Require all denied </Files>
Запретить опасные файлы (.env / .sql / .bak)
<FilesMatch "\.(env|sql|bak|log|old|orig)$"> Require all denied </FilesMatch>
Доступ только с конкретного IP
Require ip 1.2.3.4Парольная защита (Basic Auth)
AuthType Basic AuthName "Закрытая зона" AuthUserFile /srv/site/.htpasswd Require valid-user
Запрет PHP в папке загрузок
<FilesMatch "\.ph(p[0-9]?|tml)$"> Require all denied </FilesMatch>
4. Страницы ошибок
Страницы ошибок
ErrorDocument 404 /404.html ErrorDocument 403 /403.html ErrorDocument 500 /500.html
Режим обслуживания — 503 для всех кроме своего IP
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 (сжатие текстовых ответов)
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json image/svg+xml </IfModule>
Кэш статики (mod_expires)
<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 для хешированных ассетов
<IfModule mod_headers.c> <FilesMatch "\.(css|js|png|jpg|woff2)$"> Header set Cache-Control "public, max-age=31536000, immutable" </FilesMatch> </IfModule>
Убрать ETag
FileETag NoneПодробнее: оптимизация .htaccess · гид по производительности.
6. Заголовки безопасности
Заголовки безопасности
<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)
<IfModule mod_headers.c> Header set Access-Control-Allow-Origin "https://example.com" </IfModule>
Справочник всех заголовков: /headers/.
7. Чистые URL / фронт-контроллер
Фронт-контроллер (Laravel, Symfony, WordPress, любой MVC)
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [L,QSA]
Убрать расширение .php из URL
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^([^.]+)$ $1.php [L]
Убрать index.php из URL (301 — чтобы не было дублей)
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 ForbiddenG— вернуть 410 GoneEND— полная остановка (не только текущий проход)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 правил)
10. Ссылки
Полезные разделы сайта
- Справочник директив .htaccess
- Рецепты .htaccess — блоки с объяснениями
- Готовые .htaccess под задачу — полные файлы под сценарий
- Генератор .htaccess — собрать из чекбоксов
- Оптимизация .htaccess
- Справочник HTTP-заголовков
- Безопасность сайта через .htaccess
- Линтер .htaccess
- Тестер RewriteRule
- Тестер регулярных выражений
- Туториал по mod_rewrite
- PCRE: регулярные выражения для mod_rewrite