Задать вопрос
Driver86
@Driver86
Немодератор toster.ru

Почему nginx set кодирует значение?

Есть такой location:
location ~ '(*UTF8)^/\x{0444}\x{043E}\x{0442}\x{043E}/(.+?\.jpg)$' {
set $var1 $1;
set $var2 'тест';
return 200 "uri: $uri\n1: $1\nvar1: $var1\nvar2: $var2";
add_header Content-Type 'text/html; charset=utf-8';
}

Если открыть, например, такой url: https://мой.сайт/фото/тест.jpg
то ожидается это:
uri: /фото/тест.jpg
1: тест.jpg
var1: тест.jpg
var2: тест

однако на самом деле вывод такой:
uri: /фото/тест.jpg
1: тест.jpg
var1: %D1%82%D0%B5%D1%81%D1%82.jpg
var2: тест

Т.е., как будто бы set кодирует значение, но только если это значение имеет отношение к uri. Несколько странное поведение.
Баг или фича?
  • Вопрос задан
  • 32 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
Driver86
@Driver86 Автор вопроса
Немодератор toster.ru
Не баг, а фича.
https://serverfault.com/questions/1036804/nginx-ma...
Оператор try_files использует числовые захваты из регулярного выражения в location операторе. Проблема с числовыми захватами заключается в том, что они перезаписываются всякий раз, когда вычисляется регулярное выражение. map содержит регулярное выражение, которое вычисляется между операторами locationи try_files.
Решение — использовать именованные захваты

Не знаю, точно ли это мой случай, но с именованными захватами эта проблема действительно исчезла. Видимо, если в конфиге nginx больше одного регулярного выражения, стоит всё-таки избегать числовые захваты.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы