Понимание работы NGINX URL Rewrite

Если углубиться в работу 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 версию.

В приведенном выше примере директива 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, может стать вашим союзником, перенаправляя определенные страницы на новое место.

Здесь, когда URI запроса будет точно соответствовать шаблону /tutorial/learning-nginx, NGINX перенаправит его в новое место https://example.com/nginx/understanding-nginx/. Вы также можете использовать директиву return для перенаправления всех страниц, попадающих под определенный путь, в новое место. В следующем примере показано, как перенаправить все страницы из каталога /tutorial на https://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 будет обрабатывать перезапись.

Вот пример:

В этом примере директива перезаписи в контексте местоположения соответствует URI, которые относятся к /tututorial/learning-nginx. После совпадения эти URI переписываются в /tututorial/understanding-nginx. Последний флаг здесь сообщает NGINX о прекращении дальнейшей обработки директив перезаписи в текущем наборе.

Тонкости директивы перезаписи NGINX

Директива rewrite позволяет выполнять сложную перезапись URL в NGINX, которая часто включает в себя манипуляции с параметрами или частями исходного URL. Для этого вы можете использовать круглые скобки в регулярном выражении (regex), чтобы определить части URL, которые вы хотите захватить. Эти захваченные части, также известные как "захваты", затем могут быть использованы в переписанном URL.

В приведенном ниже примере показан сценарий, в котором захваченные части исходного URL используются для формирования нового URL.

В этом примере исходный URL /product/123/awesome-product будет переписан в /product.php?id=123&name=awesome-product. Первый захват ([0-9]+) соответствует любому числу (id продукта), а второй захват (.*) соответствует любому тексту (название продукта).

Использование флага прерывания в NGINX Rewrite

Еще один флаг, который имеет решающее значение при перезаписи URL в NGINX, - это флаг break. Хотя он может показаться похожим на флаг last, поскольку останавливает дальнейшую обработку правил перезаписи, флаг break действует только в текущем блоке расположения. В отличие от последнего, он не заставляет NGINX искать новый блок местоположения, соответствующий переписанному URL.

Это правило соответствует любому URL в каталоге /images и переписывает его, удаляя часть /images из URL. Если приходит запрос на /images/logo.png, он будет переписан на /logo.png. Флаг break гарантирует, что никакие другие правила перезаписи не будут обрабатываться в этом блоке расположения.

Заключение

В заключение, перезапись URL - это мощная функция NGINX, которая обеспечивает тонкий контроль над тем, как обрабатываются запросы клиентов. Владение директивами return и rewrite поможет вам эффективно управлять перенаправлениями и преобразованиями URL, обеспечивая гибкость и простоту обслуживания вашего веб-сервера или приложения.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий