Поиск по сайту:

Примеры правил перезаписи URL в Nginx


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

Директива возврата NGINX

Самый простой и чистый способ переписать URL-адрес — использовать директиву return. Директива return должна быть объявлена в контексте server или местоположения, указав URL-адрес для перенаправления.

1. Директива возврата NGINX в контексте сервера

Директива return в контексте сервера очень полезна в ситуации, когда вы перенесли свой сайт на новый домен и хотите перенаправить все старые URL-адреса на новый домен. Кроме того, это также помогает в канонизации URL-адреса, заставляя ваш сайт перенаправлять на версию с www или без www.

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-адресом. В приведенной выше директиве возврата используются две переменные: $scheme и $request_uri. Переменная $scheme используется для определения схемы URL-адреса (http или https), а переменная $request_uri содержит полный URI с параметрами, если таковые имеются. Помните, что переменная извлекает эту информацию из входного URL-адреса при перезаписи URL-адреса.

2. Директива возврата в контексте местоположения

В некоторых случаях вы можете захотеть перенаправить страницы вместо перенаправления доменов. Директива return внутри блока location позволяет вам перенаправлять определенные страницы в новое место.

location = /tutorial/learning-nginx {
     return 301 $scheme://example.com/nginx/understanding-nginx
}

В приведенном выше примере всякий раз, когда URI запроса точно совпадает с шаблоном /tutorial/learning-nginx, NGINX перенаправит его на новое место https://example.com/nginx/understanding. -nginx/ Вы также можете перенаправить все по определенному пути в новое место. В следующем примере показано, как перенаправить все страницы, попадающие под /tutorial, на https://example.com/articles.

location /tutorial {
     return 301 $scheme://example.com/articles
}

Директива перезаписи NGINX

Мы также можем использовать директиву rewrite для перезаписи URL в NGINX. Как и директива возврата, директива перезаписи также может быть размещена как в контексте сервера, так и в контексте местоположения. Директива rewrite может выполнять сложные различия между URL-адресами и элементами выборки из исходного URL-адреса, которые не имеют соответствующих переменных NGINX, что делает ее более полезной, чем директива return. Синтаксис директивы перезаписи:

rewrite regex replacement-url [flag];

  • regex: регулярное выражение на основе PCRE, которое будет использоваться для сопоставления с URI входящего запроса.
  • replacement-url: если регулярное выражение совпадает с запрошенным URI, строка замены используется для изменения запрошенного URI.
  • flag: значение флага определяет, нужна ли дальнейшая обработка директивы перезаписи или нет.

Помните, что директива rewrite может возвращать только код 301 или 302. Чтобы вернуть другие коды, вам нужно включить директиву return явно после директивы rewrite.

Примеры директив NGINX Rewrite

Давайте быстро проверим несколько правил перезаписи, чтобы вы начали с этого, начиная с перезаписи простой HTML-страницы на другой URL:

1. Переписать статическую страницу

Рассмотрим сценарий, в котором вы хотите переписать URL-адрес страницы, скажем, https://example.com/nginx-tutorial на https://example.com/somePage.html. Директива перезаписи, чтобы сделать то же самое, приведена в следующем блоке местоположения.

server {
          ...
          ...
          location = /nginx-tutorial 
          { 
            rewrite ^/nginx-tutorial?$ /somePage.html break; 
          }
          ...
          ...
}

Объяснение:

  • Директива местоположения location=/nginx-tutorial говорит нам, что блок местоположения будет соответствовать только URL-адресу, содержащему точный префикс, который является /nginx-tutorial.
  • NGINX будет искать шаблон ^/nginx-tutorial?$ в запрошенном URL.
  • Чтобы определить шаблон, символы ^,? и $используются и имеют особое значение.
  • ^представляет собой начало строки для сопоставления.
  • $представляет собой конец строки для сопоставления.
  • ? представляет нежадный модификатор. Нежадный модификатор прекратит поиск шаблона, как только будет найдено совпадение.
  • Если запрошенный URI содержит указанный выше шаблон, то вместо него будет использоваться файл somePage.html.
  • Поскольку правило перезаписи заканчивается разрывом, перезапись также останавливается, но перезаписанный запрос не передается в другое место.

2. Переписать динамическую страницу

Теперь рассмотрим динамическую страницу https://www.example.com/user.php?id=11, где динамической частью является id=11(userid). Мы хотим, чтобы URL-адрес был переписан на https://exampleshop.com/user/11. Если у вас есть 10 пользователей, вам потребуется 10 правил перезаписи для каждого пользователя, если вы будете следовать последнему методу перезаписи URL-адресов. Вместо этого можно захватить элементы URL-адреса в переменных и использовать их для создания единого правила перезаписи, которое будет заботиться обо всех динамических страницах.

server {
          ...
          ...
          location = /user.php 
          { 
            rewrite user.php?id=$1 ^user/([0-9]+)/?$ break; 
          }
          ...
          ...
}

Объяснение:

  • Директива местоположения location=/user сообщает NGINX, что блок местоположения должен сопоставляться с URL-адресом, содержащим точный префикс, который равен /user.
  • NGINX будет искать шаблон ^user/([0-9]+)/?$ в запрошенном URL-адресе.
  • Регулярное выражение в квадратных скобках [0–9]+ содержит диапазон символов от 0 до 9. Знак + означает соответствие одному или нескольким предшествующим символам. Без знака + приведенное выше регулярное выражение будет соответствовать только 1 символу, например 5 или 8, но не 25 или 44.
  • Скобка ( ) в регулярном выражении относится к обратной ссылке. $1 в замещающем URL-адресе user.php?id=$1 указывает на эту обратную ссылку.

Например, если https://www.example.com/user/24 является входным URL-адресом, то идентификатор пользователя 24 будет соответствовать диапазону в обратной ссылке, что приведет к следующей замене: https ://www.example.com/user.php?id=24

3. Предварительная перезапись URL

Давайте продолжим с другим примером, где мы хотим, чтобы URL-адрес https://www.example.com/user.php?user_name=john был переписан на https://www.example. com/пользователь/логин/джон. В отличие от предыдущего правила перезаписи, динамическая часть URL-адреса user_name=john теперь содержит диапазон буквенных символов. Правило перезаписи для этого сценария приведено ниже:

server {
          ...
          ...
          location = /user.php 
            { 
                rewrite user.php?user_name=$1 ^user/login/([a-z]+)/?$ break;           
            }
          ...
          ...
  }

Объяснение:

  • Директива местоположения location=/user/login/john сообщает NGINX, что блок местоположения должен сопоставляться с URL-адресом, содержащим точный префикс, который равен /user/login/john. .
  • NGINX будет искать шаблон ^user/login/([a-z]+)/?$ в запрошенном URL-адресе.
  • Регулярное выражение в квадратных скобках [a-z]+ содержит диапазон символов от a до z. Знак + означает соответствие одному или нескольким предшествующим символам. Без знака + приведенное выше регулярное выражение будет соответствовать только 1 символу, например a или c, но не john или doe.
  • Скобка ( ) в регулярном выражении относится к обратной ссылке. $1 в замещающем URL-адресе user.php?user_name=$1 указывает на эту обратную ссылку.

Например, если входной URL-адрес https://www.example.com/user/login/john, тогда имя пользователя \john будет совпадать с диапазоном в обратной ссылке, что приведет к следующая замена: https://www.example.com/user.php?user\_name=john

4. Перепишите с несколькими обратными ссылками

В этом примере мы также узнаем, как переписать URL-адрес, используя несколько обратных ссылок. Предположим, что входной URL-адрес — https://example.com/tutorial/linux/wordpress/file1, и мы хотим переписать URL-адрес на https://example.com/tutorial/ Linux/cms/file1.php. Если вы внимательно посмотрите на входной URL, он начинается с /tutorial, а где-то дальше в пути нужно заменить строку wordpress на строку cms. Кроме того, расширение файла (php) также необходимо добавить в конце имени файла. Правило перезаписи для этого сценария приведено ниже:

server {
          ...
          ...
          location /tutorial
          {
             rewrite ^(/tutorial/.*)/wordpress/(\w+)\.?.*$ $1/cms/$2.php last;
          }
          ...
          ...
  }

Объяснение:

  • Первая обратная ссылка ^(/tutorial/.*) в регулярном выражении, используемая для сопоставления любого входного URL, начинающегося с /tutorial/foo
  • Вторая обратная ссылка (\w+) используется для захвата имени файла только без расширения.
  • Приведенные выше две обратные ссылки используются в заменяющем URL с использованием $1 и $2.
  • Ключевое слово last предписывает NGINX прекратить анализ дополнительных условий перезаписи даже при следующем совпадении местоположения!

Резюме

Теперь вы можете переписать URL-адрес, используя директиву rewrite или return. Примеры перезаписи, используемые в этом руководстве, просты и понятны. Теперь вы можете приступить к написанию более сложных правил перезаписи!