在Nginx中实现基于URL路径的访问控制(ACL)是反向代理配置中的常见需求。以下是几种实现URL匹配ACL的方法:
server {
listen 80;
server_name example.com;
# 允许访问的路径
location /public/ {
proxy_pass http://backend_server;
}
# 禁止访问的路径
location /private/ {
return 403;
}
}
server {
listen 80;
server_name example.com;
# 允许特定模式的URL
location ~ ^/api/v[1-3]/ {
proxy_pass http://backend_server;
}
# 禁止包含敏感词的URL
location ~* /(admin|config)/ {
return 403;
}
}
map $uri $is_allowed {
default 0;
~^/public/ 1;
~^/api/v[1-3]/ 1;
}
server {
listen 80;
server_name example.com;
if ($is_allowed = 0) {
return 403;
}
location / {
proxy_pass http://backend_server;
}
}
server {
listen 80;
server_name example.com;
location /write/ {
limit_except GET {
deny all;
}
proxy_pass http://backend_server;
}
}
geo $block_url {
default 0;
192.168.1.100 1; # 这个IP可以访问受限URL
}
map $uri $restricted {
default 0;
~^/admin/ 1;
}
server {
listen 80;
server_name example.com;
location / {
if ($restricted = 1) {
set $block_url 1;
}
if ($block_url = 0) {
return 403;
}
proxy_pass http://backend_server;
}
}
nginx -t
测试配置,并实际验证ACL效果# 示例:记录被拒绝的访问
log_format acl_denied '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_uri';
server {
# ...其他配置...
location /private/ {
access_log /var/log/nginx/acl_denied.log acl_denied;
return 403;
}
}
通过合理配置这些URL匹配规则,可以构建灵活且安全的Nginx反向代理ACL系统。