if 语句中 proxy_pass 指令的 nginx 替代方案
nginx alternative for proxy_pass directive within if statement
我有以下 NGINX 配置:
- location /concepts {
auth_basic "off";
if ($http_accept ~ 'application/json') { set $isapirequest "true"; }
if ($http_accept ~ 'application/ld\+json') { set $isapirequest "true"; }
if ($http_accept ~ 'application/hal\+json') { set $isapirequest "true"; }
if ( $isapirequest = "true" ) { proxy_pass http://127.0.0.1:5315/search/concepts/; }
if ( $isapirequest != "true" ) {
rewrite ^/concepts$ /concepts/ redirect;
rewrite ^(.*)$ /blah last;
}
include add_cors_headers_OPTIONS_HEAD_GET_PUT_DELETE;
}
我得到的错误是:
\"proxy_pass\" cannot have URI part in location given by regular expression, or inside named location, or inside \"if\" statement, or inside \"limit_except\"
你们能想到在 NGINX 上不使用 "if" 语句就可以实现上述目标的方法吗?
你的最后两个 if
语句是互斥的,所以可以删除其中一个,这将消除你得到的错误。
This document 指示哪些语句应该在 location
上下文中的 if
块中使用。您可以考虑使用 map
替换 if
语句中除一个以外的所有语句。
例如:
map $http_accept $redirect {
default 1;
~application/json 0;
~application/ld\+json 0;
~application/hal\+json 0;
}
server {
...
location /concepts {
auth_basic "off";
if ($redirect) {
rewrite ^(.*)$ /blah last;
}
proxy_pass http://127.0.0.1:5315/search/concepts;
include add_cors_headers_OPTIONS_HEAD_GET_PUT_DELETE;
}
...
}
rewrite ^/concepts$ /concepts/ redirect;
语句可以移至处理/blah/concepts
URI的location
,重写为rewrite ^/blah/concepts$ /concepts/ redirect;
.
有关更多信息,请参阅 this document。
我有以下 NGINX 配置:
- location /concepts {
auth_basic "off";
if ($http_accept ~ 'application/json') { set $isapirequest "true"; }
if ($http_accept ~ 'application/ld\+json') { set $isapirequest "true"; }
if ($http_accept ~ 'application/hal\+json') { set $isapirequest "true"; }
if ( $isapirequest = "true" ) { proxy_pass http://127.0.0.1:5315/search/concepts/; }
if ( $isapirequest != "true" ) {
rewrite ^/concepts$ /concepts/ redirect;
rewrite ^(.*)$ /blah last;
}
include add_cors_headers_OPTIONS_HEAD_GET_PUT_DELETE;
}
我得到的错误是:
\"proxy_pass\" cannot have URI part in location given by regular expression, or inside named location, or inside \"if\" statement, or inside \"limit_except\"
你们能想到在 NGINX 上不使用 "if" 语句就可以实现上述目标的方法吗?
你的最后两个 if
语句是互斥的,所以可以删除其中一个,这将消除你得到的错误。
This document 指示哪些语句应该在 location
上下文中的 if
块中使用。您可以考虑使用 map
替换 if
语句中除一个以外的所有语句。
例如:
map $http_accept $redirect {
default 1;
~application/json 0;
~application/ld\+json 0;
~application/hal\+json 0;
}
server {
...
location /concepts {
auth_basic "off";
if ($redirect) {
rewrite ^(.*)$ /blah last;
}
proxy_pass http://127.0.0.1:5315/search/concepts;
include add_cors_headers_OPTIONS_HEAD_GET_PUT_DELETE;
}
...
}
rewrite ^/concepts$ /concepts/ redirect;
语句可以移至处理/blah/concepts
URI的location
,重写为rewrite ^/blah/concepts$ /concepts/ redirect;
.
有关更多信息,请参阅 this document。