ip白名單或者黑名單,目的是爲了達到一種受限訪問,但願在名單內用戶能夠訪問,就把名單叫白名單;但願在名單內用戶拒絕訪問,就是黑名單。不管咱們但願使用哪一種名單方式,實現方式都同樣。javascript
在nginx下咱們一般會考慮用nginx+lua的方式來實現,它很優雅速度快。確實,這是一種方案,我也作過這種方案的研究。但我覺的它不夠靈活,我選擇在應用程序中來實現名單機制。php
主要思路:用戶->獲取ip->redis取出名單庫->比對->處理css
代碼Github庫:https://github.com/jacoobwang...html
控制訪問java
<?php isAccess(); /** * 檢測是否在白名單內,不然拒絕訪問 * * @return void */ function isAccess(){ $ip = getRemoteIp(); if(!empty($ip)) { $inst = new Redis(); $inst->connect('127.0.0.1', 6379); $ip_white_list = $inst->sMembers('ip_blacklist'); if(!in_array($ip, $ip_white_list)) { echo '<h1 align=center>HTTP/1.1 403 Forbidden</h1>'; header('HTTP/1.1 403 Forbidden'); } } } /** * 獲取用戶的IP * * @return void */ function getRemoteIp(){ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }elseif(isset($_SERVER['HTTP_CLIENT_IP'])){ $ip = $_SERVER['HTTP_CLIENT_IP']; }elseif(getenv('HTTP_X_FORWARDED_FOR')){ $ip = getenv('HTTP_X_FORWARED_FOR'); }elseif(getenv('HTTP_CLIENT_IP')){ $ip = getenv('HTTP_CLIENT_IP'); }elseif($_SERVER['REMOTE_ADDR']){ $ip = $_SERVER['REMOTE_ADDR']; } else{ $ip = null; } return $ip; }
動態配置頁面jquery
<?php $inst = new Redis(); $inst->connect('127.0.0.1', 6379); $ip = $inst->sMembers('ip_blacklist'); $li = ''; foreach($ip as $val) { $li .= '<li><span>'.$val.'</span> <a data="'.$val.'" class="js_del" href="javascript:void(0)">delete</a></li>'; } ?> <html> <head> <style> ul,li { list-style: none; } ul { margin: 0; padding: 0; } li { padding: 5px; padding-top:0; } </style> </head> <body> <ul id="ipList"> <?php echo $li;?> </ul> <input type="text" name="ip_text" /> <button id="submit">add</button> </body> <script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.js"></script> <script> $(function(){ // 刪除 $('#ipList').on('click','.js_del',function(){ var _this = this, ip_text = $(this).attr('data'); $.ajax({ url: 'http://localhost:6699/ip-white-php/ip.php', method: 'POST', data: 'type=delete&ip='+ip_text, success: function(res){ if(res == 1){ alert('success'); $(_this).parent().remove(); } else { alert('failed'); } } }) }) // 添加 $('#submit').click(function(){ var ip_text = $("input[type=text]").val(), re = /^\d{2,3}.\d{2,3}.\d{2,3}.\d{1,3}$/; if (!re.test(ip_text)) { alert('您輸入的IP格式不對'); return; } $.ajax({ url: 'http://localhost:6699/ip-white-php/ip.php', method: 'POST', data: 'type=add&ip='+ip_text, success: function(res){ if(res == 1){ alert('success'); $('#ipList').append('<li><span>'+ip_text+'</span> <a data="'+ip_text+'" class="js_del" href="javascript:void(0)">delete</a></li>') } else { alert('failed'); } } }) }) }) </script> </html>
配置頁面接口nginx
<?php $inst = new Redis(); $inst->connect('127.0.0.1', 6379); $type = isset($_POST['type']) ? $_POST['type'] : ''; $ip = isset($_POST['ip']) ? $_POST['ip'] : ''; if(!empty($ip)){ $isExist = $inst->sIsMember('ip_blacklist',$ip); if($isExist) { if($type == 'delete'){ // delete $rs = $inst->sRemove('ip_blacklist',$ip); echo $rs; } } else { if($type == 'add'){ if(preg_match('/^\d{2,3}.\d{2,3}.\d{2,3}.\d{1,3}$/',$ip)) { $rs = $inst->sAdd('ip_blacklist',$ip); echo $rs; } else { echo 2; } } } }