這功能通常是用在管理者後台,讓外部用戶不能直接訪問管理者後台,必免有心人事嘗試登入。
可透過 Nginx X-Forwarded-For
及 Host
的 proxy_set_header
函式,取得用戶真實IP,並加入判斷式回傳 http statu code。
一、指定 IP
[root@localhost ~]$ vim /etc/nginx/nginx.conf server { listen 80; server_name yourdomain.com; proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400; # 定義 header 變數, 記錄使用者的 IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_max_temp_file_size 0; proxy_set_header Connection ""; proxy_buffering off; proxy_request_buffering off; access_log /var/log/nginx/$host-access.log main; error_log /var/log/nginx/$host-error.log; if ($proxy_add_x_forwarded_for !~ "192.168.1.2") { return 403; } location / { proxy_pass http://192.168.1.3:8080$uri$is_args$args; } } :wq [root@localhost ~]$ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost ~]$ nginx -s reload
程式說明:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
取得請求 HeaderX-Forwarded-For
中的用户真實 IP, 並加到$proxy_add_x_forwarded_for
變數內if(...)
變數$proxy_add_x_forwarded_for
不等於192.168.1.2
並回覆return 403
,返回 403
二、多判斷式
[root@localhost ~]$ vim /etc/nginx/nginx.conf server { listen 80; server_name yourdomain.com; proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400; # 定義 header 變數, 記錄使用者的 IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_max_temp_file_size 0; proxy_set_header Connection ""; proxy_buffering off; proxy_request_buffering off; access_log /var/log/nginx/$host-access.log main; error_log /var/log/nginx/$host-error.log; if ($http_host ~ "yourdomain.com") { set $set_block HostErr; } if ($proxy_add_x_forwarded_for != '192.168.1.2') { set $set_block "${set_block}IPErr"; } if ($set_block = HostErrIPErr) { return 403; break; } location / { proxy_pass http://192.168.1.3:8080$uri$is_args$args; } } :wq [root@localhost ~]$ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@localhost ~]$ nginx -s reload
如果都不匹配時會出現以下狀況