Если углубиться в работу NGINX, то одним из аспектов, требующих внимания, является его способность выполнять перезапись URL. В мире NGINX перезапись URL означает изменение либо части, либо всего URL по запросу клиента. Основной причиной для такой перезаписи URL в NGINX является информирование клиентов, когда ресурсы, которые они искали, изменили свое местоположение. Одновременно перезапись URL в NGINX обеспечивает расширенный контроль над потоком выполнения страниц.
Основы директив перезаписи NGINX
В NGINX перезапись URL-адресов осуществляется в основном с помощью двух директив - return и rewrite. Хотя обе они служат общей цели перезаписи URL, директива rewrite обладает большей силой, чем директива return. Это связано с тем, что она может обрабатывать сложную перезапись URL в NGINX, которая включает в себя разбор URL.
Освоение директивы return в NGINX
Директива return - это готовое решение для простой и чистой перезаписи URL в NGINX. Объявленная в контексте сервера или местоположения, эта директива указывает URL, который необходимо перенаправить.
Директива return в работе в контексте сервера
В контексте сервера директива return становится особенно полезной при переносе сайта на новый домен и необходимости перенаправления всех старых URL на этот новый домен. Кроме того, она помогает в канонизации URL, заставляя ваш сайт перенаправляться либо на www, либо на не www версию.
1 2 3 4 5 | server { listen 80; server_name www.olddomain.com; return 301 $scheme://www.newdomain.com$request_uri; } |
В приведенном выше примере директива return в контексте сервера перенаправляет URL-адреса, предназначенные для сайта www.olddomain.com, на www.newdomain.com. Как только NGINX получает URL для www.olddomain.com, он останавливает дальнейшую обработку страницы и отправляет клиенту код ответа 301 вместе с переписанным URL. В директиве return здесь задействованы две переменные: $scheme и $request_uri. Переменная $scheme обозначает схему URL (http или https), а $request_uri содержит полный URI, включая любые параметры. Эти переменные собирают информацию из входного URL в процессе перезаписи URL в NGINX.
Изучение директивы возврата в контексте местоположения
Иногда вам может понадобиться перенаправить конкретные страницы, а не целые домены. В таких ситуациях директива return, вложенная в блок location, может стать вашим союзником, перенаправляя определенные страницы на новое место.
1 2 3 4 | location = /tutorial/learning-nginx { return 301 $scheme://example.com/nginx/understanding-nginx } /* Ваш код... */ |
Здесь, когда URI запроса будет точно соответствовать шаблону /tutorial/learning-nginx, NGINX перенаправит его в новое место https://example.com/nginx/understanding-nginx/. Вы также можете использовать директиву return для перенаправления всех страниц, попадающих под определенный путь, в новое место. В следующем примере показано, как перенаправить все страницы из каталога /tutorial на https://example.com/articles.
1 2 3 | location /tutorial { return 301 $scheme://example.com/articles } |
Использование возможностей директивы перезаписи NGINX
Помимо директивы return, NGINX предоставляет директиву rewrite для перезаписи URL. Как и ее аналог, директива rewrite может быть размещена как в контексте сервера, так и в контексте местоположения. Однако она имеет преимущество перед директивой return благодаря своей способности более тонко различать URL и извлекать из исходного URL элементы, не имеющие соответствующих переменных NGINX.
Общий синтаксис директивы rewrite - rewrite regex URL [flag];, где:
- regex означает регулярное выражение, которое соответствует желаемым URL-адресам
- URL - новый URL, на который будут перенаправлены совпавшие URL-адреса
- flag (необязательный) используется для указания того, как NGINX будет обрабатывать перезапись.
Вот пример:
1 2 3 | location /tutorial { rewrite ^(/tutorial)/learning-nginx$ $1/understanding-nginx last; } |
В этом примере директива перезаписи в контексте местоположения соответствует URI, которые относятся к /tututorial/learning-nginx. После совпадения эти URI переписываются в /tututorial/understanding-nginx. Последний флаг здесь сообщает NGINX о прекращении дальнейшей обработки директив перезаписи в текущем наборе.
Тонкости директивы перезаписи NGINX
Директива rewrite позволяет выполнять сложную перезапись URL в NGINX, которая часто включает в себя манипуляции с параметрами или частями исходного URL. Для этого вы можете использовать круглые скобки в регулярном выражении (regex), чтобы определить части URL, которые вы хотите захватить. Эти захваченные части, также известные как "захваты", затем могут быть использованы в переписанном URL.
В приведенном ниже примере показан сценарий, в котором захваченные части исходного URL используются для формирования нового URL.
1 | rewrite ^/product/([0-9]+)/(.*)$ /product.php?id=$1&name=$2 last; |
В этом примере исходный URL /product/123/awesome-product будет переписан в /product.php?id=123&name=awesome-product. Первый захват ([0-9]+) соответствует любому числу (id продукта), а второй захват (.*) соответствует любому тексту (название продукта).
Использование флага прерывания в NGINX Rewrite
Еще один флаг, который имеет решающее значение при перезаписи URL в NGINX, - это флаг break. Хотя он может показаться похожим на флаг last, поскольку останавливает дальнейшую обработку правил перезаписи, флаг break действует только в текущем блоке расположения. В отличие от последнего, он не заставляет NGINX искать новый блок местоположения, соответствующий переписанному URL.
1 2 3 | location /images { rewrite ^/images/(.*) /$1 break; } |
Это правило соответствует любому URL в каталоге /images и переписывает его, удаляя часть /images из URL. Если приходит запрос на /images/logo.png, он будет переписан на /logo.png. Флаг break гарантирует, что никакие другие правила перезаписи не будут обрабатываться в этом блоке расположения.
Заключение
В заключение, перезапись URL - это мощная функция NGINX, которая обеспечивает тонкий контроль над тем, как обрабатываются запросы клиентов. Владение директивами return и rewrite поможет вам эффективно управлять перенаправлениями и преобразованиями URL, обеспечивая гибкость и простоту обслуживания вашего веб-сервера или приложения.