Я пытаюсь добиться чего-то вроде этого:
location /location1/{
if ($arg_api_key = a_valid_api_key) {
proxy_pass http://localhost:8080;
}
# else jump to location2
}
location /location2/{
# a lot of validation code here
}
Как это сделать в nginx? Или есть лучший способ справиться с этим?
Во-первых, помните, что если зло и избегайте ничего, кроме rewrite
или return
внутри if
; предлагается обходной путь использовать error_page
и return
для изменения местоположения, используемого для обработки запроса.
Так как уже ответил здесь, способ повторно использовать настройки местоположения в nginx - переместить их в отдельный файл и include
этот файл в вашем location
блоки.
Объединение этих решений приводит к:
# a lot of validation code here
location /location1/ {
error_page 418 = @proxy;
recursive_error_pages on;
if ($arg_api_key = a_valid_api_key) {
return 418;
}
include /etc/nginx/validation_code.conf;
}
location /location2/ {
include /etc/nginx/validation_code.conf;
}
location @proxy {
proxy_pass http://localhost:8080;
}
Вы также можете подумать об использовании именованного местоположения для вашего кода проверки вместо создания отдельного файла; однако вам понадобятся некоторые уловки, чтобы переключиться на это названное место - например, другое error_page
/return
пара или что-то вроде
try_files /nonexistent @validation