What I want
For my /admin location, whitelist several trusted IP addresses, and block everyone else.
What I have
http { map $remote_addr $admin_block_path { default "/admin"; 1.1.1.1 "/not-admin"; 8.8.8.8 "/not-admin"; } # … server { add_header X-Test-Admin "$admin_block_path"; location $admin_block_path { return 403; } } } The idea is to use map do conditionally determine a path to block from a visitor IP address. Store it in a variable, and use that variable in location. If the request comes from a non-trusted IP, the variable will contain /admin, and therefore the location will block /admin.
What is the problem
The location does not block access to /admin.
- I can confirm using
add_headerthat the variable is set based on the IP address correctly. When visiting from a non-trusted IP I do get/admin, and respectively/non-adminwhen visiting from a trusted IP. - If I replace
location $admin_block_pathwith hardcodedlocation /admin, the request does get blocked - Tried playing with double quotes, no effect
- Tried taking the slash outside of the variable, no effect
Note
Unfortunately, I can't simply hardcode allow/deny into some /admin location because that would overwrite PHP pass configuration I have elsewhere in the config. Because of this, I need to have a dedicated /admin location only if I know I'll reject the request anyway, and no PHP will be needed.
Nginx version: 1.20.1