Nginx location块 可以放置在server块内或另一个 location块内,语法为:
location [modifier] [URI] {
...
...
}
location块中的修饰符modifier是可选的,修饰符有:
=
:用于将location块与请求的URI完全匹配。~
:用于区分大小写的正则表达式与请求的 URI 匹配。~*
:用于与请求的 URI 进行不区分大小写的正则表达式匹配。^~
:用于对请求的 URI 执行最长的非正则表达式匹配。如果请求的 URI 命中此location块,则不会发生进一步的匹配。优先级别如下
优先级 | 修饰符 | 支持正则 | 匹配模式 | 同级存在多个匹配 |
---|---|---|---|---|
1 | = |
否 | 完全匹配 | 报重复冲突 |
2 | ^~ |
否 | 前缀匹配 | 匹配前缀最长的一个,如果完全相同则报重复冲突 |
3 | ~ 和~* |
是 | 通配符匹配 | 匹配第一个 |
4 | none | 否 | 前缀匹配 | 匹配前缀最长的一个,如果完全相同则报重复冲突 |
参考nginx官方文档的一个例子
location = / {
#[ configuration A ]
return 200 "configuration A";
}
location / {
#[ configuration B ]
return 200 "configuration B";
}
location /documents/ {
#[ configuration C ]
return 200 "configuration C";
}
location ^~ /images/ {
#[ configuration D ]
return 200 "configuration D";
}
location ~* \.(gif|jpg|jpeg)$ {
#[ configuration E ]
return 200 "configuration E";
}
请求 /
返回configuration A
请求 /index.html
返回configuration B
请求 /documents/document.html
返回configuration C
请求/images/1.gif
返回configuration D
请求/documents/1.jpg
返回configuration E
很多人对 ^~
和 ~^
分不清。
其实location修饰符只有^~
,并没有 ~^
。
~^
实际是 修饰符~
后面加^
开头的正则表达式:
例如 location ~ ^/id/\d+
匹配 /id/123
的请求
因为nginx配置文件对间隔符的兼容忽略,写成location ~^/id/\d+
也同样有效。
为了配置的可读性,建议 ~ ^
不要写成~^
。
注意location中root和alias的区别
当设置 root 的时候:
location /i/ {
root /data/w3;
}
请求 /i/top.gif
将访问 /data/w3/i/top.gif
当设置 alias 的时候:
location /i/ {
alias /data/w3/images/;
}
请求 /i/top.gif
将访问 /data/w3/images/top.gif
把前端页面/tags/* 路径误写成/tag/* 进行纠正
location ~ ^/tag/(.+) {
if ($query_string) {
return 301 /tags/$1?$query_string;
}
return 301 /tags/$1;
}
静态文件设置长远时间过期,这样就会在浏览器中缓存更长时间
# Set expires to year on static file types
location ~* ^.+\.(css|js|jpg|jpeg|gif|webp|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|mp4)$ {
expires 365d;
access_log off;
}
access日志中不记录favicon图标请求日志
location ~ (?:apple-touch-.*|favicon.*)\.(?:png|ico) {
log_not_found off;
access_log off;
}
防止外站盗链图片
location ~ .(png|gif|jpe?g)$ {
valid_referers none blocked yourwebsite.com *.yourwebsite.com;
if ($invalid_referer) {
return 403;
}
}
防止可写目录中的脚本访问
location ~* /(media|images|cache|tmp|logs)/.*.(php|jsp|pl|py|asp|cgi|sh)$ {
return 403;
}