location:在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,
并找出一个最佳匹配(匹配的j location{}里的root,而不是server{}的root),而后应用其配置,
location [ = | ~ | ~* | ^~ ] uri { ... }
允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理。
1).location = / { [ configuration A ]} 请求“/”匹配配置A,
2).location / {[ configuration B ]} 请求“/index.html”匹配配置B,
3).location /documents/ {[ configuration C ]} 请求“/documents/document.html”,2和3都匹配,3更精确匹配配置C
4).location ^~ /images/ {[ configuration D ]} 请求“/images/1.gif”,2和4和5都匹配,根据优先匹配配置D,
5).location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] } 请求“/documents/1.jpg”,2和3和5都匹配,5更精确匹配配置E,
= #用于标准uri前,需要请求字串与uri精确匹配,如果匹配成功就停止向下匹配并立即处理请求。 (常用 )
~ #用于标准uri前,表示包含正则表达式并且区分大小写,并且匹配 (常用 )
* #用于标准uri前,表示包含正则表达式并且代表任意长度的任意字符
~* #用于标准uri前,表示包含正则表达式并且不区分大小写,并且任意字符匹配 (常用 )
!~ #用于标准uri前,表示包含正则表达式并且区分大小写,并且不匹配
!~* #用于标准uri前,表示包含正则表达式并且不区分大小写,并且不匹配
^~ #用于标准uri前,表示包含正则表达式并且匹配以什么开头 ,URI左半部分匹配,不区分字符大小写。(常用 )
$ #用于标准uri前,表示包含正则表达式并且匹配以什么结尾
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以转. * ?等
根 不带符号 匹配起始于此uri的所有的uri
location优先级:(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正 则顺序) > (location 部分起始路径) > (/)
常用正则表达式:
字符 描述
\ 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或者多次
+ 匹配前面字符串一次或者多次
? 匹配前面字符串的零次或者一次
. 匹配除“\n”(换行符)之外的所有单个字符
| 或
(pattern) 匹配括号内的pattern
生产案例:
#静态资源配置
location ^~ /static/ {
root /data/nginx/static
}
#或者
location ~* \.(gif|jpg|jpeg|png|bmp|tiff|tif|css|js|ico)$ {
root /data/nginx/static;
}
#动态资源配置
location ~ \.(php|jsp|asp) {
root /data/nginx/dynamic;
}
如区分大小写则"只能"访问Aa.jpg。
对于不区分大小写的location,则可以访问任意大小写结尾的图片文件,不区分大小写则可以访问aa.jpg以外的资源比如Aa.JPG、aA.jPG这样的混合名称文件,但是要求nginx服务器的资源目录有相应的文件,比如有Aa.JPG有aA.jPG
#区分大小写
#location ~ /A.?\.jpg {
#不区分大小写
location ~* /A.?\.jpg {
index index.html;
root /data/nginx/html/location;
}
locaton 匹配说明
3、ginx.conf 配置中有个漏洞,那就是没有配置哪些目录是不允许直接访问的,在传统tomcat作为服务器的时候,tomcat本身的机制就禁止直接访问WEB-INF下的内容,
但是在nginx中,由于配置了部分内容直接从nginx转发出去,这就导致了WEB-INF目录实际上可能会被暴露出去,一旦暴漏了,那么系统架构,源代码,数据库配置文件,
系统配置文件等内容将一并泄露,这对于商业项目来讲会是致命的安全隐患,再次提醒自己以及相关人士,一定要配置不允许访问的目录。
location ~ ^/(WEB-INF|META-INF)/{
deny all;
}
4、封杀特定的url特定的文件扩展名,比如.bak
location ~* \.(bak|save|sh|sql|mdb|svn|git|old|php|zip|exe|rar|asp|aspx)$ {
return 405;
}
5、
location ~ /\.ht {
deny all;
}
5、你可以对指定的目录设置访问权限。所有的网站目录应该一一的配置,只允许必须的目录访问权限。你可以通过IP地址来限制访问目录/docs/:
location /docs/ {
deny 192.168.1.1;
allow 192.168.1.0/24;}
其它安全加固说明
1、封杀各种user-agent,user-agent 也即浏览器标识,每个正常的web请求都包含用户的浏览器信息,除非经过伪装,恶意扫描工具一般都会在user-agent里留下某些特征字眼,
比如scan,nmap等。我们可以用正则匹配这些字眼,从而达到过滤的目的
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) {
return 403;
}
if ($http_user_agent ~* "" ) { return 403; }
阻止Soso和有道的机器人:
if ($http_user_agent ~* Sosospider|YodaoBot) {return 403;
2、封杀特定的http方法和行为
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 405;}
if ($http_range ~ "\d{9,}") {
return 444;}
3、强制网站使用域名访问,可以逃过IP扫描,
if ( $host !~* 'abc.com' ) { return 403;}
4、强制要求referer
if ($http_referer = "" ) { return 403; }