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配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。