Возможность изменения (Rewrite) во входящем URL в другой URL на основе ваших критериев является существенным признаком для любого веб-сервера.
Nginx Rewrite является очень мощным и гибким.
В этой статье мы объясним следующие примеры на основе Nginx Rewrite:
Ниже приведен синтаксис Nginx Rewrite:
rewrite reg-ex replacement [flag];
В приведенном выше:
В Nginx, директива Rewrite может быть указана в одном из следующих трех контекстов: server, location, if
Ниже приведен пример директивы Nginx Rewrite:
rewrite ^(/data/.*)/andreyex/(\w+)\.?.*$ $1/linux/$2.html last;
Например:
В приведенном выше правила перезаписи:
В то время как правила перезаписи Nginx делают подобные вещи, как Apache, есть еще много различий в плане того, как вы пишете правило перезаписи в Nginx.
Используя Rewrite, вы можете трассировать много поступающих оригинальных URL в шаблон мастера контроллера, который будет обслуживать эти запросы.
Следующий пример Rewrite объясняет это.
rewrite ^/linux/(.*)$ /linux.php?distro=$1 last;
В приведенном выше примере, когда вы делаете запрос к URL andreyex.ru/linux/centos, он получит переписанный с использованием вышеуказанного правила, и он выдаст страницу с этим переписанным URL: andreyex.ru/linux.php?distro=centos
Как вы видите выше, любой URL, который имеет соответствующий шаблон здесь (т.е. /linux/ в URL) будет выполнять linux.php, но последняя часть в исходном входящем URL будет использоваться в качестве значения для аргумента distro контроллера linux.php.
Таким образом, приведенное выше правило перезаписи преобразует входящий URL, как здесь:
Как и в предыдущем примере, мы используем $ 1 в замещающей строке, чтобы захватить все, что находится внутри 1-й скобках () в reg-ех. В этом случае, последняя часть оригинального входящего URL.
Мы также используем здесь флаг last, чтобы проинструктировать Nginx, остановить поиск дальнейших директив Rewrite в текущем-блоке и о переходе к следующему месту соответствия для дальнейшего поиска.
В этом примере, мы поместили условие перезаписи внутри директивы location.
В этом примере директива location /data/, также совпадает с $ 1 в строке замены, приведенной ниже.
location /data/ { rewrite ^(/data/.*)/andreyex/(\w+)\.?.*$ $1/linux/$2.html break; return 403; }
Это то, что случилось бы, если бы вы использовали флаг «last»:
Так как мы не хотим описанное выше поведение, мы использовали «break» в качестве флага, который просто остановит обработку перезаписи блоков.
Если строка замены включает новые аргументы запроса, предыдущие аргументы запроса добавляются после них. Если вы не хотите этого,установка знака вопроса в конце строки замены избавляет от необходимости их добавлять.
В следующем примере, в строке замены, нет знака вопроса в конце. т.е. нет вопросительного знака после $ 1
rewrite ^/linux/(.*)$ /linux.php?distro=$1 last;
В приведенном выше примере, когда замена строки включает входящие аргументы запроса, то аргументы из предыдущего запроса добавляется после них.
Несколько раз, вы, вероятно, не хотите, чтобы добавление произошло. Что в этом случае рекомендуется использовать? Показано ниже.
Что в следующем примере в строке замещения Rewrite Nginx, мы добавили? в конце. Существует вопросительный знак после $ 1
rewrite ^/linux/(.*)$ /linux.php?distro=$1? last;
В приведенном выше примере, строка замены включают входящие аргументы запроса, поэтому аргументы из предыдущего запроса не добавляется после них.
Следующие несколько примеров показывают, что мы можем использовать Rewrite внутри директивы if.
Вы можете сделать условное переписывание на основе if, если условие сравнения с использованием переменных, таких как $scheme, $http_host, $http_user_agent, и т.д., как показано ниже:
if ($scheme = "http") { rewrite ^ http://www.andreyex.ru$uri permanent; } if ($http_host = andreyex.ru) { rewrite (.*) http://www.andreyex.ru$1; } if ($http_user_agent = MSIE) { rewrite ^(.*)$ /pdf/$1 break; }
Обратите внимание, что есть лучшие способы для достижения конечного результата приведенных выше примеров. Приведенные выше примеры просто даны для того, чтобы показать, что мы можем добавить директиву rewrite внутри, если заявление в файле конфигурации Nginx.
Обратите внимание, что вы можете также установить значение двух следующих параметров или выключить в файле конфигурации Nginx:
server_name_in_redirect on port_in_redirect off
Ниже приведены 4 различных директив flags в Nginx Rewrite, которые вы можете использовать.
last: Этот флаг остановит обработку директив перезаписи в текущем наборе, и начнет на новом месте , которое соответствует измененной URL.
rewrite ^(/data/.*)/andreyex/(\w+)\.?.*$ $1/linux/$2.html last;
break: Этот флаг остановит обработку директив перезаписи в текущем наборе.
rewrite ^(/data/.*)/andreyex/(\w+)\.?.*$ $1/linux/$2.html break;
redirect: Этот флаг будет делать временную переадресацию с использованием 302 HTTP – кода. Это в основном используется , когда строка замены не HTTP или HTTPS, или $ схема
permanent: Этот флаг будет делать постоянную переадресацию с помощью HTTP 301 кода
rewrite ^ http://www.andreyex.ru$uri permanent;
По умолчанию, в любое время, при успешной перезапись в Nginx, он не регистрирует его в error.log.
Первоначально, когда вы пишете сложные правила перезаписи, вы действительно хотите убедиться, что Nginx будет делать rewrite согласно вашему требованию.
Для этого необходимо включить журнал перезаписи, который будет добавлять в журнал запись Nginx, что делает успешную перезапись, используя любые из директив перезаписи в файле конфигурации.
Для этого используйте директиву rewrite_log.
Добавьте следующие две строки в Nginx default.conf:
error_log /var/log/nginx/error.log notice; rewrite_log on;
В приведенном выше:
После указанного изменения, вы начали видеть такие строки, которые ясно показывают, какие конкретные правила переписываются в переводе входящего URL. Это также покажет окончательный перевод URL в записи журнала.
[notice] 12345#12345: *1 "^(/data/.*)/andreyex/(\w+)\.?.*$" matches "/data/distro/andreyex/test", client: 192.168.101.1, server: localhost, request: "GET /data/distro/andreyex/test HTTP/1.1", host: "213.159.209.228" [notice] 12345#12345: *1 rewritten data: "/data/distro/linux/test.html", args: "", client: 192.168.101.1, server: localhost, request: "GET /data/distro/andreyex/test HTTP/1.1", host: "213.159.209.228"
В приведенном выше строк лога:
“Создание сайтов”, блин.
Поправь анимацию, стыд же 🙂
http://recordit.co/RFdyOuzyII
И вот ещё – что за безымянные поля в форме отправки комментариев?
https://yadi.sk/i/xbT4CoGH3Q8Ry9
Да это уже лень, видно возраст дает о себе знать )
Спасибо за подробное описание – помогло разобраться )
Искал интересующий вопрос. И только у тебя нашел как его сделать. Итог быстро написанный код. У остальных ресурсов долбанный копипаст. Автору от души, так сказать..
А как например передать полученную переделанную ссылку в переменную для дальнейшей передачи в скрипт?