The trick here is to combine auth_basic and auth_request , here is an example:
location = /api { satisfy any; auth_basic "Restricted Access"; auth_basic_user_file "/usr/local/nginx/htpasswd"; auth_request /auth; try_files $uri $uri/ /api.html; } location = /auth { proxy_pass http://localhost:8080; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; }
You will notice that the auth_basic_user_file file is present, and you probably do not want it, but you can leave the file empty, satisfy any will accept any successful results, auth_basic will fail, but it will also set the user and password in the HTTP headers that are redirected to your backend script where you can handle them accordingly.
source share