proxy_pass перезаписывает URL, измененный директивой rewrite - PullRequest
0 голосов
/ 08 января 2019

Из документации nginx , как указано ниже, я понимаю, что директива proxy_pass не изменит URI и просто передаст переписанный URI на сервер.

  • Когда URI изменяется внутри прокси-сервера с использованием директивы rewrite, и эта же конфигурация будет использоваться для обработки запроса (перерыв):

    location /name/ {
        rewrite    /name/([^/]+) /users?name=$1 break;
        proxy_pass http://127.0.0.1/randomstring;
    }
    

    В этом случае URI, указанный в директиве, игнорируется, и полный URI измененного запроса передается на сервер.

Но когда я устанавливаю proxy_pass в переменную, URI перезаписывается.

Пример:

location /test_rewrite {
    set $ups_addr http://upstream_server;
    rewrite /test_rewrite /test_rewrite_upstream break;
    proxy_pass $ups_addr/random_string;
}

URI /test_rewrite переписывается в /random_string.

Может кто-нибудь помочь мне понять причину такого поведения?

1 Ответ

0 голосов
/ 08 января 2019

Как указано в той же документации:

  • Когда переменные используются в 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;
}
...