NGINX позволяет изменять URL-запросы с помощью директив rewrite и return. Это используется для перенаправлений, очистки URL, миграции структуры сайта и обработки маршрутов приложений.
Директива return
Самый простой способ сделать редирект — использовать return.
server {
listen 80;
server_name old-site.com;
return 301 https://new-site.com$request_uri;
}В этом примере:
301означает постоянный редирект$request_uriсохраняет путь и параметры исходного URL
Если пользователь откроет:
http://old-site.com/blog/postон будет перенаправлен на:
https://new-site.com/blog/postДиректива return работает быстрее и проще, чем rewrite, поэтому её рекомендуют использовать для обычных редиректов.
Директива rewrite
rewrite используется для более сложных преобразований URL.
Базовый синтаксис:
rewrite regex replacement [flag];Где:
regex— регулярное выражение для поискаreplacement— новый URLflag— поведение после обработки
Пример:
location /old/ {
rewrite ^/old/(.*)$ /new/$1 last;
}Запрос:
/old/page.htmlбудет преобразован в:
/new/page.htmlФлаг last заставляет NGINX повторно обработать новый URI.
Флаги rewrite
NGINX поддерживает несколько флагов для управления поведением rewrite.
last
Повторно запускает поиск подходящего location.
rewrite ^/old/(.*)$ /new/$1 last;break
Останавливает обработку rewrite внутри текущего блока.
rewrite ^/old/(.*)$ /new/$1 break;redirect
Выполняет временный редирект 302.
rewrite ^/docs/(.*)$ /manual/$1 redirect;permanent
Выполняет постоянный редирект 301.
rewrite ^/docs/(.*)$ /manual/$1 permanent;Перенаправление HTTP на HTTPS
Частая задача это перенаправление всего HTTP-трафика на HTTPS.
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}После этого любой HTTP-запрос автоматически перейдёт на HTTPS.
Редирект без www
server {
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}Или наоборот:
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}Внутренний rewrite без изменения URL
Rewrite можно использовать без изменения адреса в браузере.
location / {
rewrite ^/profile/(.*)$ /user.php?id=$1 last;
}Если пользователь откроет:
/profile/15NGINX internally обработает запрос как:
/user.php?id=15Но в браузере останется исходный URL.
Очистка URL
Rewrite часто используют для создания "красивых" URL.
Исходный URL:
/products.php?id=25Новый URL:
/products/25Конфигурация:
location / {
rewrite ^/products/([0-9]+)$ /products.php?id=$1 last;
}Значение $1 содержит часть URL, найденную регулярным выражением.
Использование try_files
Во многих современных приложениях вместо rewrite используют try_files.
location / {
try_files $uri $uri/ /index.php?$query_string;
}NGINX:
Проверяет существование файла
Проверяет существование директории
Если ничего не найдено — передаёт запрос в
index.php
Такой подход часто используется в Laravel, WordPress и SPA-приложениях.
Rewrite для Laravel
Типичная конфигурация Laravel:
server {
listen 80;
server_name example.com;
root /var/www/project/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}Все маршруты Laravel будут автоматически передаваться в index.php.
Rewrite с параметрами
Можно извлекать части URL через регулярные выражения.
rewrite ^/category/([^/]+)/([^/]+)$ /search.php?cat=$1&item=$2 last;Запрос:
/category/books/phpстанет:
/search.php?cat=books&item=phpПроверка конфигурации
После изменения конфигурации нужно проверить синтаксис:
sudo nginx -tЕсли ошибок нет, применяем настройки:
sudo systemctl reload nginxЧастые ошибки
Бесконечные циклы rewrite возникают, когда правило повторно обрабатывает уже изменённый URL. В таких случаях используют break или более точные регулярные выражения.
Также важно помнить, что location в NGINX работает только с URI без query-параметров.