Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nginx
GitHub Repository: nginx/nginx.org
Path: blob/main/xml/ru/docs/http/ngx_http_rewrite_module.xml
1 views
1
<?xml version="1.0"?>
2
3
<!--
4
Copyright (C) Igor Sysoev
5
Copyright (C) Nginx, Inc.
6
-->
7
8
<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd">
9
10
<module name="Модуль ngx_http_rewrite_module"
11
link="/ru/docs/http/ngx_http_rewrite_module.html"
12
lang="ru"
13
rev="9">
14
15
<section id="summary">
16
17
<para>
18
Модуль <literal>ngx_http_rewrite_module</literal> позволяет
19
изменять URI запроса с помощью регулярных выражений PCRE, делать перенаправления
20
и выбирать конфигурацию по условию.
21
</para>
22
23
<para>
24
Директивы <link id="break"/>, <link id="if"/>, <link id="return"/>,
25
<link id="rewrite"/> и <link id="set"/>
26
обрабатываются в следующем порядке:
27
<list type="bullet">
28
29
<listitem>
30
последовательно выполняются директивы этого модуля, описанные на уровне
31
<link doc="ngx_http_core_module.xml" id="server"/>;
32
</listitem>
33
34
<listitem>
35
в цикле:
36
<list type="bullet">
37
38
<listitem>
39
ищется
40
<link doc="ngx_http_core_module.xml" id="location"/>
41
по URI запроса;
42
</listitem>
43
44
<listitem>
45
последовательно выполняются директивы этого модуля,
46
описанные в найденном location;
47
</listitem>
48
49
<listitem>
50
цикл повторяется, если URI запроса <link id="rewrite">изменялся</link>,
51
но не более
52
<link doc="ngx_http_core_module.xml" id="internal">10 раз</link>.
53
</listitem>
54
55
</list>
56
</listitem>
57
58
</list>
59
</para>
60
61
</section>
62
63
64
<section id="directives" name="Директивы">
65
66
<directive name="break">
67
<syntax/>
68
<default/>
69
<context>server</context>
70
<context>location</context>
71
<context>if</context>
72
73
<para>
74
Завершает обработку текущего набора директив модуля
75
<literal>ngx_http_rewrite_module</literal>.
76
</para>
77
78
<para>
79
Если директива указана внутри
80
<link doc="ngx_http_core_module.xml" id="location"/>,
81
дальнейшая обработка запроса продолжается в этом location.
82
</para>
83
84
<para>
85
Пример:
86
<example>
87
if ($slow) {
88
limit_rate 10k;
89
break;
90
}
91
</example>
92
</para>
93
94
</directive>
95
96
97
<directive name="if">
98
<syntax block="yes">(<value>условие</value>)</syntax>
99
<default/>
100
<context>server</context>
101
<context>location</context>
102
103
<para>
104
Проверяется указанное <value>условие</value>.
105
Если оно истинно, то выполняются указанные в фигурных скобках директивы
106
этого модуля и запросу назначается конфигурация, указанная внутри
107
директивы <literal>if</literal>.
108
Конфигурации внутри директив <literal>if</literal> наследуются с
109
предыдущего уровня конфигурации.
110
</para>
111
112
<para>
113
В качестве условия могут быть заданы:
114
<list type="bullet">
115
116
<listitem>
117
имя переменной; ложными значениями переменной являются пустая строка
118
или “<literal>0</literal>”;
119
<note>
120
До версии 1.0.1 ложным значением также являлась любая строка,
121
начинающаяся на “<literal>0</literal>”.
122
</note>
123
</listitem>
124
125
<listitem>
126
сравнение переменной со строкой с помощью операторов
127
<literal>=</literal>” и “<literal>!=</literal>”;
128
</listitem>
129
130
<listitem>
131
соответствие переменной регулярному выражению с учётом
132
регистра символов — “<literal>~</literal>” и без него — “<literal>~*</literal>”.
133
В регулярных выражениях можно использовать выделения, которые затем
134
доступны в виде переменных <var>$1</var>..<var>$9</var>.
135
Также можно использовать отрицательные операторы “<literal>!~</literal>
136
и “<literal>!~*</literal>”.
137
Если в регулярном выражении встречаются символы “<literal>}</literal>
138
или “<literal>;</literal>”, то всё выражение следует заключить в одинарные
139
или двойные кавычки.
140
</listitem>
141
142
<listitem>
143
проверка существования файла с помощью операторов “<literal>-f</literal>
144
и “<literal>!-f</literal>”;
145
</listitem>
146
147
<listitem>
148
проверка существования каталога с помощью операторов “<literal>-d</literal>
149
и “<literal>!-d</literal>”;
150
</listitem>
151
152
<listitem>
153
проверка существования файла, каталога или символической ссылки
154
с помощью операторов “<literal>-e</literal>” и “<literal>!-e</literal>”;
155
</listitem>
156
157
<listitem>
158
проверка исполняемости файла с помощью операторов “<literal>-x</literal>
159
и “<literal>!-x</literal>”.
160
</listitem>
161
162
</list>
163
</para>
164
165
<para>
166
Примеры:
167
<example>
168
if ($http_user_agent ~ MSIE) {
169
rewrite ^(.*)$ /msie/$1 break;
170
}
171
172
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
173
set $id $1;
174
}
175
176
if ($request_method = POST) {
177
return 405;
178
}
179
180
if ($slow) {
181
limit_rate 10k;
182
}
183
184
if ($invalid_referer) {
185
return 403;
186
}
187
</example>
188
<note>
189
Значение встроенной переменной <var>$invalid_referer</var> задаётся директивой
190
<link doc="ngx_http_referer_module.xml" id="valid_referers"/>.
191
</note>
192
</para>
193
194
</directive>
195
196
197
<directive name="return">
198
<syntax><value>код</value> [<value>текст</value>]</syntax>
199
<syntax><value>код</value> <value>URL</value></syntax>
200
<syntax><value>URL</value></syntax>
201
<default/>
202
<context>server</context>
203
<context>location</context>
204
<context>if</context>
205
206
<para>
207
Завершает обработку и возвращает клиенту указанный <value>код</value>.
208
Нестандартный код 444 закрывает соединение без передачи
209
заголовка ответа.
210
</para>
211
212
<para>
213
Начиная с версии 0.8.42 можно задать
214
либо URL перенаправления (для кодов 301, 302, 303, 307 и 308)
215
либо <value>текст</value> тела ответа (для остальных кодов).
216
В тексте тела ответа и URL перенаправления можно использовать переменные.
217
Как частный случай, URL перенаправления может быть задан как URI,
218
локальный для данного сервера, при этом полный URL перенаправления
219
формируется согласно схеме запроса (<var>$scheme</var>) и директивам
220
<link doc="ngx_http_core_module.xml" id="server_name_in_redirect"/> и
221
<link doc="ngx_http_core_module.xml" id="port_in_redirect"/>.
222
</para>
223
224
<para>
225
Кроме того, в качестве единственного параметра можно указать
226
<value>URL</value> для временного перенаправления с кодом 302.
227
Такой параметр должен начинаться со строк “<literal>http://</literal>”,
228
<literal>https://</literal>” или “<literal>$scheme</literal>”.
229
В <value>URL</value> можно использовать переменные.
230
</para>
231
232
<para>
233
<note>
234
До версии 0.7.51 можно было возвращать только следующие коды:
235
204, 400, 402 — 406, 408, 410, 411, 413, 416 и 500 — 504.
236
</note>
237
238
<note>
239
До версий 1.1.16 и 1.0.13 код 307 не обрабатывался как перенаправление.
240
</note>
241
242
<note>
243
До версии 1.13.0 код 308 не обрабатывался как перенаправление.
244
</note>
245
</para>
246
247
<para>
248
См. также директиву <link doc="ngx_http_core_module.xml" id="error_page"/>.
249
</para>
250
251
</directive>
252
253
254
<directive name="rewrite">
255
<syntax>
256
<value>regex</value>
257
<value>замена</value>
258
[<value>флаг</value>]</syntax>
259
<default/>
260
<context>server</context>
261
<context>location</context>
262
<context>if</context>
263
264
<para>
265
Если указанное регулярное выражение соответствует URI запроса, URI изменяется
266
в соответствии со строкой замены.
267
Директивы <literal>rewrite</literal> выполняются последовательно,
268
в порядке их следования в конфигурационном файле.
269
С помощью флагов можно прекратить дальнейшую обработку директив.
270
Если строка замены начинается с “<literal>http://</literal>”,
271
<literal>https://</literal>” или “<literal>$scheme</literal>”,
272
то обработка завершается и клиенту возвращается перенаправление.
273
</para>
274
275
<para>
276
Необязательный параметр <value>флаг</value> может быть одним из:
277
<list type="tag">
278
279
<tag-name><literal>last</literal></tag-name>
280
<tag-desc>
281
завершает обработку текущего набора директив модуля
282
<literal>ngx_http_rewrite_module</literal>,
283
после чего ищется новый location, соответствующий изменённому URI;
284
</tag-desc>
285
286
<tag-name><literal>break</literal></tag-name>
287
<tag-desc>
288
завершает обработку текущего набора директив модуля
289
<literal>ngx_http_rewrite_module</literal>
290
аналогично директиве <link id="break"/>;
291
</tag-desc>
292
293
<tag-name><literal>redirect</literal></tag-name>
294
<tag-desc>
295
возвращает временное перенаправление с кодом 302;
296
используется, если заменяющая строка не начинается с
297
<literal>http://</literal>”, “<literal>https://</literal>
298
или “<literal>$scheme</literal>”;
299
</tag-desc>
300
301
<tag-name><literal>permanent</literal></tag-name>
302
<tag-desc>
303
возвращает постоянное перенаправление с кодом 301.
304
</tag-desc>
305
306
</list>
307
Полный URL перенаправлений формируется согласно
308
схеме запроса (<var>$scheme</var>) и директив
309
<link doc="ngx_http_core_module.xml" id="server_name_in_redirect"/> и
310
<link doc="ngx_http_core_module.xml" id="port_in_redirect"/>.
311
</para>
312
313
<para>
314
Пример:
315
<example>
316
server {
317
...
318
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
319
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
320
return 403;
321
...
322
}
323
</example>
324
</para>
325
326
<para>
327
Если же эти директивы поместить в location “<literal>/download/</literal>”,
328
то нужно заменить флаг <literal>last</literal> на <literal>break</literal>,
329
иначе nginx сделает 10 циклов и вернёт ошибку 500:
330
<example>
331
location /download/ {
332
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
333
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
334
return 403;
335
}
336
</example>
337
</para>
338
339
<para>
340
Если в строке замены указаны новые аргументы запроса, то предыдущие
341
аргументы запроса добавляются после них.
342
Если такое поведение нежелательно, можно отказаться от этого добавления,
343
указав в конце строки замены знак вопроса, например:
344
<example>
345
rewrite ^/users/(.*)$ /show?user=$1? last;
346
</example>
347
</para>
348
349
<para>
350
Если в регулярном выражении встречаются символы “<literal>}</literal>
351
или “<literal>;</literal>”, то всё выражение следует заключить в одинарные
352
или двойные кавычки.
353
</para>
354
355
</directive>
356
357
358
<directive name="rewrite_log">
359
<syntax><literal>on</literal> | <literal>off</literal></syntax>
360
<default>off</default>
361
<context>http</context>
362
<context>server</context>
363
<context>location</context>
364
<context>if</context>
365
366
<para>
367
Разрешает или запрещает записывать в
368
<link doc="../ngx_core_module.xml" id="error_log"/>
369
на уровне <literal>notice</literal>
370
результаты обработки директив модуля <literal>ngx_http_rewrite_module</literal>.
371
</para>
372
373
</directive>
374
375
376
<directive name="set">
377
<syntax><value>$переменная</value> <value>значение</value></syntax>
378
<default/>
379
<context>server</context>
380
<context>location</context>
381
<context>if</context>
382
383
<para>
384
Устанавливает значение указанной переменной.
385
В качестве значения можно использовать текст, переменные и их комбинации.
386
</para>
387
388
</directive>
389
390
391
<directive name="uninitialized_variable_warn">
392
<syntax><literal>on</literal> | <literal>off</literal></syntax>
393
<default>on</default>
394
<context>http</context>
395
<context>server</context>
396
<context>location</context>
397
<context>if</context>
398
399
<para>
400
Определяет, нужно ли писать в лог предупреждения о неинициализированных
401
переменных.
402
</para>
403
404
</directive>
405
406
</section>
407
408
409
<section id="internals" name="Внутреннее устройство">
410
411
<para>
412
Директивы модуля <literal>ngx_http_rewrite_module</literal>
413
компилируются на стадии конфигурации во внутренние инструкции,
414
интерпретируемые во время обработки запроса.
415
Интерпретатор представляет из себя простую стековую виртуальную машину.
416
</para>
417
418
<para>
419
Например, директивы
420
<example>
421
location /download/ {
422
if ($forbidden) {
423
return 403;
424
}
425
426
if ($slow) {
427
limit_rate 10k;
428
}
429
430
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
431
}
432
</example>
433
будут транслированы в такие инструкции:
434
<example>
435
переменная $forbidden
436
проверка на ноль
437
возврат 403
438
завершение всего кода
439
переменная $slow
440
проверка на ноль
441
проверка регулярного выражения
442
копирование "/"
443
копирование $1
444
копирование "/mp3/"
445
копирование $2
446
копирование ".mp3"
447
завершение регулярного выражения
448
завершение всего кода
449
</example>
450
</para>
451
452
<para>
453
Обратите внимание, что инструкций для директивы
454
<link doc="ngx_http_core_module.xml" id="limit_rate"/>
455
нет, поскольку она не имеет отношения к модулю
456
<literal>ngx_http_rewrite_module</literal>.
457
Для блока <link id="if"/> создаётся отдельная конфигурация.
458
Если условие истинно, запрос получает эту конфигурацию,
459
и в ней <literal>limit_rate</literal> равен 10k.
460
</para>
461
462
<para>
463
Директиву
464
<example>
465
rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
466
</example>
467
можно сделать на одну инструкцию меньше, если в регулярном выражении перенести
468
первый слэш внутрь скобок:
469
<example>
470
rewrite ^(<emphasis>/</emphasis>download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
471
</example>
472
Тогда соответствующие инструкции будут выглядеть так:
473
<example>
474
проверка регулярного выражения
475
копирование $1
476
копирование "/mp3/"
477
копирование $2
478
копирование ".mp3"
479
завершение регулярного выражения
480
завершение всего кода
481
</example>
482
</para>
483
484
</section>
485
486
</module>
487
488