.htaccess в nginx: куда перенести правила и как их переписать
nginx не читает файлы .htaccess: правила из них на сайте с nginx ничего не делают. Их переносят в файл настроек сайта: для переадресаций, запретов, пароля, кэша и сжатия в nginx есть свои строки, а после правки настройки проверяют и применяют двумя командами.
Содержание 14
- Что сделать прямо сейчас
- Почему nginx не видит .htaccess
- Где писать правила
- Какая строка чем заменяется
- Переадресации
- Адрес с www — без if
- Доступ и пароль
- Кэш, сжатие и заголовки
- Сайт на PHP: все адреса в index.php
- Закройте старые файлы .htaccess
- Как проверить
- Ошибки и как их исправить
- Источники
- Что почитать дальше
Что сделать прямо сейчас
- Не удаляйте старый .htaccess, пока не перенесёте все правила: по нему удобно сверяться. Доступ к нему закройте — как.
- Команды вводятся на сервере: подключитесь к нему по SSH ([как подключиться](/instrukcii/kak-podklyuchitsya-k-vps-po-ssh/)) и набирайте их в том же окне. Откройте файл сайта:
sudo nano /etc/nginx/sites-available/example.com. Вместо example.com — имя файла вашего сайта: список покажетls /etc/nginx/sites-enabled/. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. - Перепишите строки из .htaccess по таблице и впишите их внутрь блока server вашего сайта.
- Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки:
sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их:sudo systemctl reload nginx. Если проверка нашла ошибку, nginx назовёт файл и номер строки, а сайт продолжит работать на старых настройках. Что значит сообщение — Все ошибки nginx. - Проверьте результат через curl — как.
Почему nginx не видит .htaccess
Apache читает .htaccess при каждом запросе. nginx берёт настройки только из своих файлов и применяет их после перезагрузки настроек или перезапуска, а файлы .htaccess не читает вовсе. Поэтому строки из .htaccess на сайте с nginx ничего не делают и не дают ошибки.
Эта страница — для своего VPS с nginx, например настроенного по инструкции Как разместить сайт на VPS. Если сайт на виртуальном хостинге и правила не действуют, начните со статьи Почему .htaccess не работает.
Где писать правила
- Правила для всего сайта — внутри блока server, в строке server_name которого стоит ваш домен. Если сайт работает по HTTPS, это блок со строкой
listen 443 ssl— как устроены блоки. - Правила для одной папки — в блоке
location ^~ /папка/. Знаки ^~ нужны, чтобы правила действовали и на файлы .php в этой папке: без них такие адреса уйдут в общий блок для PHP — как nginx выбирает блок. Чтобы PHP в папке работал, внутрь вкладывают свой блок для PHP — пример в разделе Доступ и пароль. - Если .htaccess лежал во вложенной папке, его строки переносят в блок location этой папки: отдельных файлов для папок у nginx нет.
Какая строка чем заменяется
| В .htaccess | В nginx | Подробнее |
|---|---|---|
Redirect 301 | return 301 в блоке location | переадресации |
RewriteRule с флагом R=301 | rewrite с флагом permanent | переадресации |
| переадресация на HTTPS | отдельный блок server для порта 80 с return 301 | 301 в nginx |
| переадресация с www или на www | отдельный блок server | адрес с www |
условия !-f и !-d и правило на index.php | try_files | сайт на PHP |
ErrorDocument 404 | error_page 404 | своя страница 404 |
Require all denied | deny all | доступ и пароль |
Require ip | allow и deny all | доступ и пароль |
AuthType Basic и AuthUserFile | auth_basic и auth_basic_user_file | пароль в nginx |
ExpiresByType | expires | кэш в nginx |
AddOutputFilterByType DEFLATE | gzip и gzip_types | сжатие в nginx |
Header set | add_header | заголовки в nginx |
Options -Indexes | ничего: список файлов в nginx выключен по умолчанию | 403 без индексного файла |
DirectoryIndex | index | строки из Apache |
php_value и php_flag | файл .user.ini или пул PHP-FPM | .user.ini |
RewriteEngine On и RewriteBase | ничего: эти строки не нужны | — |
Переадресации
Одна страница
В .htaccess было:
Redirect 301 /old-page/ /new-page/В nginx впишите внутрь блока server блок с точным адресом — знак равенства значит «ровно этот адрес»:
location = /old-page/ {
return 301 /new-page/;
}Раздел сайта со всеми страницами
В .htaccess было:
RewriteRule ^blog/(.*)$ /stati/$1 [R=301,L]В nginx — строка rewrite внутри блока server:
rewrite ^/blog/(.*)$ /stati/$1 permanent;В nginx путь в шаблоне начинается с косой черты, в отличие от RewriteRule в .htaccess. Флаг permanent даёт переадресацию 301, флаг redirect — 302. Переадресация с http:// на https:// разобрана в статье 301 Moved Permanently.
Адрес с www — без if
В .htaccess переадресацию с www делают условием RewriteCond по имени сайта. В nginx то же можно записать через if, но документация nginx называет такой способ неправильным, громоздким и неэффективным. Правильно — отдельный блок server для адреса с www:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
return 301 https://example.com$request_uri;
}Вставьте этот блок в конец того же файла, после закрывающей скобки последнего блока server, а в строке server_name главного блока оставьте только example.com. Сертификат должен включать оба имени — с www и без: так его выпускает команда Certbot из инструкции Как разместить сайт на VPS. Все шаги — в разделе Оставьте один адрес: с www или без.
Доступ и пароль
Закрыть папку целиком
Вместо Require all denied в .htaccess папки впишите внутрь блока server:
location ^~ /private/ {
deny all;
}Вместо private — имя вашей папки. На любой адрес из неё nginx ответит 403.
Пустить только свой IP
Правила allow и deny nginx проверяет по порядку до первого совпадения, поэтому allow пишут выше строки deny all. Чтобы в папке работали файлы PHP, внутрь вкладывают блок для PHP:
location ^~ /admin/ {
allow 203.0.113.10;
deny all;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}Строки include и fastcgi_pass скопируйте из блока location ~ \.php$ в том же файле: версия PHP в пути может быть другой. Вместо 203.0.113.10 укажите свой IP-адрес — с других адресов nginx ответит 403.
Пароль
Строки AuthType Basic и AuthUserFile в nginx заменяют auth_basic и auth_basic_user_file. Файл с паролями для nginx создайте по шагам из статьи Ошибка 401 Unauthorized, а блок для папки — по шагу 3 той же статьи: в нём тоже есть вложенный блок для PHP.
Кэш, сжатие и заголовки
- Строки ExpiresActive и ExpiresByType заменяет
expiresв блоке location для картинок, стилей и скриптов — готовый блок. - Сжатие AddOutputFilterByType DEFLATE заменяют строки
gzip on;иgzip_types— какие файлы сжимать. - Строки Header set заменяет
add_header— как устроена строка.
Сроки в nginx записывают по-своему, поэтому не переносите их из .htaccess как есть — берите значения из примеров по ссылкам.
Сайт на PHP: все адреса в index.php
В .htaccess сайта на PHP стоит блок, который отправляет в index.php все адреса, кроме существующих файлов и папок:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /index.php [END]В nginx его заменяет одна строка try_files. Если в файле сайта уже есть блок location /, поменяйте строку try_files в нём, а если блока нет, впишите его внутрь блока server:
location / {
try_files $uri $uri/ /index.php?$args;
}nginx ищет файл с таким именем, затем папку, а если нет ни того ни другого, передаёт запрос в index.php. Сам index.php выполняет блок location ~ \.php$ — как подключить PHP. Для WordPress нужна эта же строка: так работают постоянные ссылки. Если сайт без PHP, строка другая — готовые строки.
Закройте старые файлы .htaccess
Если в папке сайта остались файлы .htaccess и .htpasswd, nginx отдаст их по прямому адресу, а в .htpasswd лежат логины и зашифрованные пароли. Закройте такие файлы строками внутри блока server:
location ~ /\.ht {
deny all;
}Блок закрывает все файлы, имя которых начинается с .ht. Такой же блок есть в файле default из пакета nginx в Ubuntu: там он закомментирован и нужен, если у nginx и Apache одна папка сайта.
Как проверить
В терминале компьютера (как открыть терминал, про curl) запросите старый адрес с переадресацией:
curl -I https://example.com/old-page/В ответе должны быть код 301 и строка Location с новым адресом; curl может показать Location маленькими буквами. Проверьте и запрет на служебные файлы:
curl -I https://example.com/.htaccessОтвет 403 — файл закрыт. curl не запоминает переадресации, а браузер ответ 301 запоминает: если curl показывает новое, а браузер старое, очистите кэш браузера.
Ошибки и как их исправить
| Что видите | Что делать |
|---|---|
| nginx -t пишет unknown directive | в файл попала строка из .htaccess: замените её по таблице — разбор ошибки |
| is not allowed here | строка стоит не в том блоке — разбор ошибки |
| unexpected end of file или unexpected "}" | не хватает фигурной скобки или есть лишняя — разбор ошибки |
| directive is not terminated by ";" | в конце строки нет точки с запятой — разбор ошибки |
| ERR_TOO_MANY_REDIRECTS | переадресации по кругу — разбор ошибки |
| открывается только главная, остальные страницы — 404 | нет строки try_files с index.php — как заменить |
| файлы .php в закрытой папке не выполняются | в блоке location ^~ нет вложенного блока для PHP — пример |
| правило не действует, ошибок нет | проверьте, что выполнена команда reload и строка стоит в блоке server с вашим доменом в server_name, затем проверьте через curl |
Источники
- Документация nginx: return — возвращает код ответа и адрес переадресации.
- Документация nginx: rewrite — флаг permanent — переадресация 301, redirect — 302.
- Документация nginx: converting rewrite rules — вместо if с $http_host — отдельный блок server с return 301; проверки файлов заменяет try_files.
- Документация nginx: location — знаки = и ^~ и порядок выбора блока.
- Документация nginx: try_files — файлы проверяются по порядку, последний вариант — адрес или код ответа.
- Документация nginx: модуль ngx_http_access_module — правила allow и deny проверяются по порядку до первого совпадения.
- Документация nginx: auth_basic_user_file — файл с именами и паролями пользователей.
- Документация nginx: autoindex — список файлов по умолчанию выключен.
- Документация nginx: руководство для начинающих — изменения в файле настроек вступают в силу только после перезагрузки настроек или перезапуска nginx.
- Файл sites-available/default из пакета nginx в Ubuntu 24.04 — закомментированный блок
location ~ /\.htс deny all — на случай, если папка сайта общая с Apache. - Справка PHP: файлы .user.ini — работают при CGI и FastCGI, в том числе при PHP-FPM.
Сверено 15 октября 2026 года.
Что почитать дальше
- Настройки nginxкак устроены файлы и блоки.
- Ошибка nginx unknown directiveесли nginx -t не принимает строку.
- 301 Moved Permanentlyпереадресации в nginx и Apache.
- try_files в nginxчто отдать, если файла нет.
- Файл .htaccessкак правила устроены в Apache.