语法、规则、优先级、注意事项
Nginx的HTTP配置主要包括三个区块:
http { //这个是协议级别 include mime.types; default_type application/octet-stream; keepalive_timeout 65; gzip on; server { //这个是服务器级别 listen 80; server_name localhost; location / { //这个是请求级别 root html; index index.html index.htm; } }}
下面我们主要介绍的是location块的内容。
location [=|~|~*|^~] patt { } //中括号中为修饰符,可以不写任何参数,此时称为一般匹配,也可以写参数
因此,大类型可以分为三种:
location = patt {} [精准匹配]
location patt{} [普通匹配]
location ~ patt{} [正则匹配]
localtion可以由前缀字符串或正则表达式定义。正则表达式使用前面的“〜*”修饰符(不区分大小写匹配)或“〜”修饰符(用于区分大小写匹配)指定。要找到匹配给定请求的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。默认情况, nginx先检查前缀字符串,然后检查正则表达式,如果前缀字符串匹配到了,并且前缀字符串有这个“^~” 要求,就不配正则了;如果没有这个“^~” ,即使前缀匹配到了,也要去匹配正则表则,如果正则表达式匹配到了,就是用正则表达式的,没有就是用前缀字符串匹配到的路径
1. 没有修饰符表示必须以指定模式开始。
location /img { root D:/nginx/img; index test.png; }
以下访问都是对的:
http://localhost/imghttp://localhost/img/http://localhost/imgdehttp://localhost/img?p1
配成:
location /img/ { root D:/nginx/img/; index test.png; }
效果还是一样。因为使用的是前缀字符串匹配。
2. =表示必须与指定的模式精确匹配
location = /img/ { root D:/nginx/; index test.png; }
那么,如下是对的:
http://localhost/imghttp://localhost/img?p1
如下是错的:
http://localhost/img/http://localhost/imgmde
3. ~ 表示:指定的正则表达式要区分大小写
server {server_name localhost; location ~ ^/img$ { root D:/nginx/; index test.png; }}那么,如下是对的:http://localhost/imghttp://localhost/img?p1=11&p2=22如下是错的:http://localhost/IMGhttp://localhost/img/http://localhost/imgde
4. ~* 表示:指定的正则表达式不区分大小写
server {server_name localhost;location ~* ^/abc$ { root D:/nginx/; index test.png; }}那么,如下是对的:http://localhost/abchttp://localhost/ABChttp://localhost/abc?p1=11&p2=22如下是错的:http://localhost/abc/http://localhost/abcde
5. ^~ 类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,那么就停止搜索其他模式了。如果最长匹配的前缀位置具有“^〜”修饰符,则不会检查正则表达式。
注意,上面说的提升优先级主要是针对模式匹配,=不是模式匹配。
location ^~ /img/ { root D:/nginx/img/; index test.png;} location = /img/test.png { root D:/nginx/denghao/; index test.png;}
这种情况会匹配等号的路径,=号的优先级比^~高。
6. @定义命名location区段,这些区段客户端不能访问
location @named { configuration E } #它是专门用来处理“内部重定向(internally redirected )如try_files或error_page等
看完上面的可以看下下面这个:
server {
listen 80;
server_name localhost;
location =/text.html { #精准匹配,浏览器输入IP地址/text.html,定位到服务器/var/www/html/text.html文件
root /var/www/html;
index text.html;
}
location / { #普通匹配,浏览器输入IP地址,定位到服务器/usr/local/nginx/html/default.html文件
root html;
index default.html;
}
location ~ image { #正则匹配,浏览器输入IP/image..地址会被命中,定位到/var/www/image/index.html
root /var/www/image;
index index.html; }
}
location = / { # 只匹配 / 的查询. [ configuration A ]}location / { # 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。 [ configuration B ]}location ^~ /images/ { # 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。 [ configuration C ]}location ~* \.(gif|jpg|jpeg)$ { # 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处 理。 [ configuration D ]}
总结:
1. root 、alias指令区别:
location /img/ { alias /var/www/image/;}
若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
location /img/ { root /var/www/image;}
若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。
alias是一个目录别名的定义,root则是最上层目录的定义。还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无。
2. 特殊字符
URL中的哈希值(后面的URL部分#)不会在HTTP请求中按设计发送。因此,nginx对此无能为力。 当用户访问时http://example.com/#aaa,nginx只会看到请求http://example.com。一种可能的解决方法是在前端使用Javascript从URL中删除哈希。
这一点可以通过设置日志格式:
然后访问http://localhost:9999/#/landingOtc/
在access.log中: