您好,我在 NGINX 后面有一个 API。该 API 被配置为要求对所有操作进行身份验证。我希望在它前面有一个 NGINX 代理来传递某些操作的身份验证参数,以便无需身份验证即可访问它们。
身份验证在主位置上运行良好,但是当我尝试在 NGXINX 位置指定特定路径时,它仍然提示我输入凭据。
这里最重要的是,我唯一想允许的操作是 STATUS。其他所有操作都不应由第二个位置接收。
有没有不用 PCRE 或正则表达式匹配来做到这一点的方法?
location / {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header X-Proxy-Cache $upstream_cache_status;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
proxy_hide_header Cache-Control;
proxy_hide_header Set-Cookie;
proxy_pass http://backend;
add_header 'Location1' '1';
location /1/2/3?action=STATUS {
add_header 'Location2' '2';
proxy_set_header Authorization "Basic BLAHBLAHBLAH";
proxy_pass http://backend;
}
}
答案1
位置匹配是针对不包含查询字符串的规范化 URI 完成的。
因此在这种情况下有必要使用 if 块:
location /1/2/3 {
if ($arg_action != "STATUS") {
return 403;
}
add_header 'Location2' '2';
proxy_set_header Authorization "Basic BLAHBLAHBLAH";
proxy_pass http://backend;
}