Я пытаюсь добиться чего-то вроде этого:
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? Или есть способ лучше?
решение1
Во-первых, помните, чтоесли это злои избегайте размещения чего-либо, кроме rewrite
или return
внутри if
; предлагается обходной путь — использовать error_page
и return
изменить местоположение, используемое для обработки запроса.
Какуже ответили здесь, способ повторного использования настроек местоположения в nginx — это переместить их в отдельный файл и добавить include
этот файл в ваши location
блоки.
Объединение этих решений приводит к:
/etc/nginx/validation_code.conf
# 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