Path: blob/main/xml/ru/docs/http/ngx_http_rewrite_module.xml
1 views
<?xml version="1.0"?>12<!--3Copyright (C) Igor Sysoev4Copyright (C) Nginx, Inc.5-->67<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd">89<module name="Модуль ngx_http_rewrite_module"10link="/ru/docs/http/ngx_http_rewrite_module.html"11lang="ru"12rev="9">1314<section id="summary">1516<para>17Модуль <literal>ngx_http_rewrite_module</literal> позволяет18изменять URI запроса с помощью регулярных выражений PCRE, делать перенаправления19и выбирать конфигурацию по условию.20</para>2122<para>23Директивы <link id="break"/>, <link id="if"/>, <link id="return"/>,24<link id="rewrite"/> и <link id="set"/>25обрабатываются в следующем порядке:26<list type="bullet">2728<listitem>29последовательно выполняются директивы этого модуля, описанные на уровне30<link doc="ngx_http_core_module.xml" id="server"/>;31</listitem>3233<listitem>34в цикле:35<list type="bullet">3637<listitem>38ищется39<link doc="ngx_http_core_module.xml" id="location"/>40по URI запроса;41</listitem>4243<listitem>44последовательно выполняются директивы этого модуля,45описанные в найденном location;46</listitem>4748<listitem>49цикл повторяется, если URI запроса <link id="rewrite">изменялся</link>,50но не более51<link doc="ngx_http_core_module.xml" id="internal">10 раз</link>.52</listitem>5354</list>55</listitem>5657</list>58</para>5960</section>616263<section id="directives" name="Директивы">6465<directive name="break">66<syntax/>67<default/>68<context>server</context>69<context>location</context>70<context>if</context>7172<para>73Завершает обработку текущего набора директив модуля74<literal>ngx_http_rewrite_module</literal>.75</para>7677<para>78Если директива указана внутри79<link doc="ngx_http_core_module.xml" id="location"/>,80дальнейшая обработка запроса продолжается в этом location.81</para>8283<para>84Пример:85<example>86if ($slow) {87limit_rate 10k;88break;89}90</example>91</para>9293</directive>949596<directive name="if">97<syntax block="yes">(<value>условие</value>)</syntax>98<default/>99<context>server</context>100<context>location</context>101102<para>103Проверяется указанное <value>условие</value>.104Если оно истинно, то выполняются указанные в фигурных скобках директивы105этого модуля и запросу назначается конфигурация, указанная внутри106директивы <literal>if</literal>.107Конфигурации внутри директив <literal>if</literal> наследуются с108предыдущего уровня конфигурации.109</para>110111<para>112В качестве условия могут быть заданы:113<list type="bullet">114115<listitem>116имя переменной; ложными значениями переменной являются пустая строка117или “<literal>0</literal>”;118<note>119До версии 1.0.1 ложным значением также являлась любая строка,120начинающаяся на “<literal>0</literal>”.121</note>122</listitem>123124<listitem>125сравнение переменной со строкой с помощью операторов126“<literal>=</literal>” и “<literal>!=</literal>”;127</listitem>128129<listitem>130соответствие переменной регулярному выражению с учётом131регистра символов — “<literal>~</literal>” и без него — “<literal>~*</literal>”.132В регулярных выражениях можно использовать выделения, которые затем133доступны в виде переменных <var>$1</var>..<var>$9</var>.134Также можно использовать отрицательные операторы “<literal>!~</literal>”135и “<literal>!~*</literal>”.136Если в регулярном выражении встречаются символы “<literal>}</literal>”137или “<literal>;</literal>”, то всё выражение следует заключить в одинарные138или двойные кавычки.139</listitem>140141<listitem>142проверка существования файла с помощью операторов “<literal>-f</literal>”143и “<literal>!-f</literal>”;144</listitem>145146<listitem>147проверка существования каталога с помощью операторов “<literal>-d</literal>”148и “<literal>!-d</literal>”;149</listitem>150151<listitem>152проверка существования файла, каталога или символической ссылки153с помощью операторов “<literal>-e</literal>” и “<literal>!-e</literal>”;154</listitem>155156<listitem>157проверка исполняемости файла с помощью операторов “<literal>-x</literal>”158и “<literal>!-x</literal>”.159</listitem>160161</list>162</para>163164<para>165Примеры:166<example>167if ($http_user_agent ~ MSIE) {168rewrite ^(.*)$ /msie/$1 break;169}170171if ($http_cookie ~* "id=([^;]+)(?:;|$)") {172set $id $1;173}174175if ($request_method = POST) {176return 405;177}178179if ($slow) {180limit_rate 10k;181}182183if ($invalid_referer) {184return 403;185}186</example>187<note>188Значение встроенной переменной <var>$invalid_referer</var> задаётся директивой189<link doc="ngx_http_referer_module.xml" id="valid_referers"/>.190</note>191</para>192193</directive>194195196<directive name="return">197<syntax><value>код</value> [<value>текст</value>]</syntax>198<syntax><value>код</value> <value>URL</value></syntax>199<syntax><value>URL</value></syntax>200<default/>201<context>server</context>202<context>location</context>203<context>if</context>204205<para>206Завершает обработку и возвращает клиенту указанный <value>код</value>.207Нестандартный код 444 закрывает соединение без передачи208заголовка ответа.209</para>210211<para>212Начиная с версии 0.8.42 можно задать213либо URL перенаправления (для кодов 301, 302, 303, 307 и 308)214либо <value>текст</value> тела ответа (для остальных кодов).215В тексте тела ответа и URL перенаправления можно использовать переменные.216Как частный случай, URL перенаправления может быть задан как URI,217локальный для данного сервера, при этом полный URL перенаправления218формируется согласно схеме запроса (<var>$scheme</var>) и директивам219<link doc="ngx_http_core_module.xml" id="server_name_in_redirect"/> и220<link doc="ngx_http_core_module.xml" id="port_in_redirect"/>.221</para>222223<para>224Кроме того, в качестве единственного параметра можно указать225<value>URL</value> для временного перенаправления с кодом 302.226Такой параметр должен начинаться со строк “<literal>http://</literal>”,227“<literal>https://</literal>” или “<literal>$scheme</literal>”.228В <value>URL</value> можно использовать переменные.229</para>230231<para>232<note>233До версии 0.7.51 можно было возвращать только следующие коды:234204, 400, 402 — 406, 408, 410, 411, 413, 416 и 500 — 504.235</note>236237<note>238До версий 1.1.16 и 1.0.13 код 307 не обрабатывался как перенаправление.239</note>240241<note>242До версии 1.13.0 код 308 не обрабатывался как перенаправление.243</note>244</para>245246<para>247См. также директиву <link doc="ngx_http_core_module.xml" id="error_page"/>.248</para>249250</directive>251252253<directive name="rewrite">254<syntax>255<value>regex</value>256<value>замена</value>257[<value>флаг</value>]</syntax>258<default/>259<context>server</context>260<context>location</context>261<context>if</context>262263<para>264Если указанное регулярное выражение соответствует URI запроса, URI изменяется265в соответствии со строкой замены.266Директивы <literal>rewrite</literal> выполняются последовательно,267в порядке их следования в конфигурационном файле.268С помощью флагов можно прекратить дальнейшую обработку директив.269Если строка замены начинается с “<literal>http://</literal>”,270“<literal>https://</literal>” или “<literal>$scheme</literal>”,271то обработка завершается и клиенту возвращается перенаправление.272</para>273274<para>275Необязательный параметр <value>флаг</value> может быть одним из:276<list type="tag">277278<tag-name><literal>last</literal></tag-name>279<tag-desc>280завершает обработку текущего набора директив модуля281<literal>ngx_http_rewrite_module</literal>,282после чего ищется новый location, соответствующий изменённому URI;283</tag-desc>284285<tag-name><literal>break</literal></tag-name>286<tag-desc>287завершает обработку текущего набора директив модуля288<literal>ngx_http_rewrite_module</literal>289аналогично директиве <link id="break"/>;290</tag-desc>291292<tag-name><literal>redirect</literal></tag-name>293<tag-desc>294возвращает временное перенаправление с кодом 302;295используется, если заменяющая строка не начинается с296“<literal>http://</literal>”, “<literal>https://</literal>”297или “<literal>$scheme</literal>”;298</tag-desc>299300<tag-name><literal>permanent</literal></tag-name>301<tag-desc>302возвращает постоянное перенаправление с кодом 301.303</tag-desc>304305</list>306Полный URL перенаправлений формируется согласно307схеме запроса (<var>$scheme</var>) и директив308<link doc="ngx_http_core_module.xml" id="server_name_in_redirect"/> и309<link doc="ngx_http_core_module.xml" id="port_in_redirect"/>.310</para>311312<para>313Пример:314<example>315server {316...317rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;318rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;319return 403;320...321}322</example>323</para>324325<para>326Если же эти директивы поместить в location “<literal>/download/</literal>”,327то нужно заменить флаг <literal>last</literal> на <literal>break</literal>,328иначе nginx сделает 10 циклов и вернёт ошибку 500:329<example>330location /download/ {331rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;332rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;333return 403;334}335</example>336</para>337338<para>339Если в строке замены указаны новые аргументы запроса, то предыдущие340аргументы запроса добавляются после них.341Если такое поведение нежелательно, можно отказаться от этого добавления,342указав в конце строки замены знак вопроса, например:343<example>344rewrite ^/users/(.*)$ /show?user=$1? last;345</example>346</para>347348<para>349Если в регулярном выражении встречаются символы “<literal>}</literal>”350или “<literal>;</literal>”, то всё выражение следует заключить в одинарные351или двойные кавычки.352</para>353354</directive>355356357<directive name="rewrite_log">358<syntax><literal>on</literal> | <literal>off</literal></syntax>359<default>off</default>360<context>http</context>361<context>server</context>362<context>location</context>363<context>if</context>364365<para>366Разрешает или запрещает записывать в367<link doc="../ngx_core_module.xml" id="error_log"/>368на уровне <literal>notice</literal>369результаты обработки директив модуля <literal>ngx_http_rewrite_module</literal>.370</para>371372</directive>373374375<directive name="set">376<syntax><value>$переменная</value> <value>значение</value></syntax>377<default/>378<context>server</context>379<context>location</context>380<context>if</context>381382<para>383Устанавливает значение указанной переменной.384В качестве значения можно использовать текст, переменные и их комбинации.385</para>386387</directive>388389390<directive name="uninitialized_variable_warn">391<syntax><literal>on</literal> | <literal>off</literal></syntax>392<default>on</default>393<context>http</context>394<context>server</context>395<context>location</context>396<context>if</context>397398<para>399Определяет, нужно ли писать в лог предупреждения о неинициализированных400переменных.401</para>402403</directive>404405</section>406407408<section id="internals" name="Внутреннее устройство">409410<para>411Директивы модуля <literal>ngx_http_rewrite_module</literal>412компилируются на стадии конфигурации во внутренние инструкции,413интерпретируемые во время обработки запроса.414Интерпретатор представляет из себя простую стековую виртуальную машину.415</para>416417<para>418Например, директивы419<example>420location /download/ {421if ($forbidden) {422return 403;423}424425if ($slow) {426limit_rate 10k;427}428429rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;430}431</example>432будут транслированы в такие инструкции:433<example>434переменная $forbidden435проверка на ноль436возврат 403437завершение всего кода438переменная $slow439проверка на ноль440проверка регулярного выражения441копирование "/"442копирование $1443копирование "/mp3/"444копирование $2445копирование ".mp3"446завершение регулярного выражения447завершение всего кода448</example>449</para>450451<para>452Обратите внимание, что инструкций для директивы453<link doc="ngx_http_core_module.xml" id="limit_rate"/>454нет, поскольку она не имеет отношения к модулю455<literal>ngx_http_rewrite_module</literal>.456Для блока <link id="if"/> создаётся отдельная конфигурация.457Если условие истинно, запрос получает эту конфигурацию,458и в ней <literal>limit_rate</literal> равен 10k.459</para>460461<para>462Директиву463<example>464rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;465</example>466можно сделать на одну инструкцию меньше, если в регулярном выражении перенести467первый слэш внутрь скобок:468<example>469rewrite ^(<emphasis>/</emphasis>download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;470</example>471Тогда соответствующие инструкции будут выглядеть так:472<example>473проверка регулярного выражения474копирование $1475копирование "/mp3/"476копирование $2477копирование ".mp3"478завершение регулярного выражения479завершение всего кода480</example>481</para>482483</section>484485</module>486487488