Как указано в той же документации:
Когда переменные используются в proxy_pass:
location /name/ {
proxy_pass http://127.0.0.1$request_uri;
}
В этом случае, если в директиве указан URI, он передается на сервер как есть, заменяя исходный URI запроса.
Это верно только в том случае, если результирующая строка содержит часть URI. Некоторые примеры:
location /test_rewrite {
set $ups_addr http://upstream_server;
rewrite /test_rewrite /test_rewrite_upstream break;
proxy_pass $ups_addr;
}
Результирующая строка не содержит часть URI, URI, переданный на вышестоящий сервер: /test_rewrite_upstream
.
location /test_rewrite {
set $ups_addr http://upstream_server/;
rewrite /test_rewrite /test_rewrite_upstream break;
proxy_pass $ups_addr;
}
Результирующая строка содержит часть URI (обратите внимание на косую черту в конце переменной $ups_addr
), URI, переданный на вышестоящий сервер: /
.
Вы можете использовать переменную $uri
для объединения правил перезаписи с пользовательскими частями URI в директиве proxy_pass
:
location /test_rewrite {
set $ups_addr http://upstream_server;
rewrite /test_rewrite /test_rewrite_upstream break;
proxy_pass $ups_addr/random_string$uri;
}
В этом случае URI, передаваемый вышестоящему серверу, равен /random_string/test_rewrite_upstream
.
Чтобы сохранить аргументы запроса, используйте переменные $is_args
и $args
:
location /test_rewrite {
set $ups_addr http://upstream_server;
rewrite /test_rewrite /test_rewrite_upstream break;
proxy_pass $ups_addr$uri$is_args$args;
}