我正在尝试实现这样的目标:
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
首先,请记住if 是邪恶的并避免在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