版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sj349781478/article/details/84997809
十七、Nginx访问控制
毫无疑问,nginx是可以做访问限制的,allow就是允许访问的ip和ip段,deny就是禁止访问的ip和ip段。
1、设置网站根目录的访问权限 location / { allow 192.168.1.1/24; allow 120.76.147.159; deny all; }
从上到下的顺序,类似iptables。匹配到了便跳出。如上的例子先禁止了192.168.1.1/24,接着禁止单个IP访问120.76.147.159,最后未匹配的IP全部禁止访问.。
2、我们再细化一点,限制访问个别目录或文件后缀名
#在访问uploads、images目录时,访问php|php5|jsp后缀的文件会返回403代码,也就是不给执行代码了 location ~ ^/(uploads|images)/.*\.(php|php5|jsp)$ { allow 192.168.1.1/24; return 403; } #禁止访问所有目录下的sql|log|txt|jar|war|sh|py后缀的文件,这些是什么文件就不详细说了。 location ~.*\.(sql|log|txt|jar|war|sh|py) { deny all; } #有时候,有些访问记录不想保存到日志里面,例如静态图片 location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF|png)$ { access_log off; } #如果想用户体验好一点,可以建立一个报错页面,然后让这个页面跳转到其他页面 error_page 403 http://www.example.com/errorfile/404.html;
3、再高级一点,判断特定条件,然后拒绝服务
#判断当http_user_agent返回的结果中包含UNAVAILABLE关键字,则返回403错误。 location / { if ($http_user_agent ~ UNAVAILABLE) { return 403; } }
再次强调,这些要跟网站实际情况相结合,要不然影响范围被扩大,造成一些莫名其妙的事,那可不是好事,不过一般403都是自己控制,比较好判断,所以最好别直接deny all。
语法规则: location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。