使用Nginx反向代理时,如何根据请求URI参数设置IP白名单?
When using Nginx reverse proxy, how can I set IP whitelist based on request URI parameter?
我的url是这样的:
http://myserver/app/inf?ConId=Obj%3Acom.aaa.bbb%3A3712 # Only IP in whitelist can access
http://myserver/app/...... # all user can access
当ConId参数为Obj%3Acom.aaa.bbb%3A3712时,我需要限制特定IP才能访问我的服务器
我尝试了以下 Nginx 配置但没有用。
location / {
if ( $arg_ConId = "Obj%3Acom.aaa.bbb%3A3712" ) {
allow 192.168.1.104;
deny all;
}
proxy_pass http://192.168.234.130:80;
add_header Access-Control-Allow-Origin *;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
allow all;
}
请帮忙,谢谢!
谢谢@araisch,我最终的 Nginx 配置是:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
error_page 403 /403.html;
location = /403.html {
root html;
}
if ($arg_ConId = "Obj%3Acom.aaa.bbb%3A3712") {
set $BLOCKING A;
}
if ($remote_addr != "192.168.3.11") {
set $BLOCKING "${BLOCKING}B";
}
if ($BLOCKING = AB) {
return 403;
break;
}
location / {
proxy_pass http://192.168.234.130:80;
add_header Access-Control-Allow-Origin *;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
allow all;
}
}
}
你可以这样使用:
location / {
auth_request /auth-here;
}
location /auth-here {
internal;
proxy_pass http://192.168.234.130:80/auth.php;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
然后在您的脚本中,您可以检查 $_SERVER['HTTP_X_ORIGINAL_URI']
和 return HTTP 200 以允许请求或 HTTP 403 以拒绝请求。
您需要 http_auth_request_module
才能使上述工作正常进行,如 the documentation 中所述。
可以使用类似的东西:
if ($arg_ConId = "Obj%3Acom.aaa.bbb%3A3712") {
set $BLOCKING A;
}
if ($remote_addr != 192.168.1.104) {
set $BLOCKING "${BLOCKING}B";
}
if ($BLOCKING = AB) {
return 403;
break;
}
在 server
块中。
您的代码中的问题:
if
location
中的指令由于 nginx 奇怪的声明规则而被认为是邪恶的。他们大部分时间都在做奇怪的事情,所以尽量避免。
- $arg_ContainerOID 没有捕获名为“ConId”的参数
备注:这在网桥模式下的dockerized nginx中不起作用,因为真实IP被防火墙屏蔽了。
我的url是这样的:
http://myserver/app/inf?ConId=Obj%3Acom.aaa.bbb%3A3712 # Only IP in whitelist can access
http://myserver/app/...... # all user can access
当ConId参数为Obj%3Acom.aaa.bbb%3A3712时,我需要限制特定IP才能访问我的服务器
我尝试了以下 Nginx 配置但没有用。
location / {
if ( $arg_ConId = "Obj%3Acom.aaa.bbb%3A3712" ) {
allow 192.168.1.104;
deny all;
}
proxy_pass http://192.168.234.130:80;
add_header Access-Control-Allow-Origin *;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
allow all;
}
请帮忙,谢谢!
谢谢@araisch,我最终的 Nginx 配置是:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
error_page 403 /403.html;
location = /403.html {
root html;
}
if ($arg_ConId = "Obj%3Acom.aaa.bbb%3A3712") {
set $BLOCKING A;
}
if ($remote_addr != "192.168.3.11") {
set $BLOCKING "${BLOCKING}B";
}
if ($BLOCKING = AB) {
return 403;
break;
}
location / {
proxy_pass http://192.168.234.130:80;
add_header Access-Control-Allow-Origin *;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
allow all;
}
}
}
你可以这样使用:
location / {
auth_request /auth-here;
}
location /auth-here {
internal;
proxy_pass http://192.168.234.130:80/auth.php;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
然后在您的脚本中,您可以检查 $_SERVER['HTTP_X_ORIGINAL_URI']
和 return HTTP 200 以允许请求或 HTTP 403 以拒绝请求。
您需要 http_auth_request_module
才能使上述工作正常进行,如 the documentation 中所述。
可以使用类似的东西:
if ($arg_ConId = "Obj%3Acom.aaa.bbb%3A3712") {
set $BLOCKING A;
}
if ($remote_addr != 192.168.1.104) {
set $BLOCKING "${BLOCKING}B";
}
if ($BLOCKING = AB) {
return 403;
break;
}
在 server
块中。
您的代码中的问题:
if
location
中的指令由于 nginx 奇怪的声明规则而被认为是邪恶的。他们大部分时间都在做奇怪的事情,所以尽量避免。- $arg_ContainerOID 没有捕获名为“ConId”的参数
备注:这在网桥模式下的dockerized nginx中不起作用,因为真实IP被防火墙屏蔽了。