location指令
-
-
- 适用区块
- 三个区块
- location 区段
- location 前缀
- location优先级
- root指令和alias指令的区别
-
适用区块
server
三个区块
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是在server块中配置,根据不同的URI使用不同的配置,来处理不同的请求。 location是有顺序的,会被第一个匹配的location处理。 语法:location [=|~|~*|^~|@] pattern{……}
location 前缀
= 表示精确匹配,优先级也是最高的,精确到文件 ^~ 表示uri以某个常规字符串开头,理解为匹配url路径 ~ 表示区分大小写的正则匹配 ~* 表示不区分大小写的正则匹配 !~ 表示区分大小写不匹配的正则 !~* 表示不区分大小写不匹配的正则 / 通用匹配,任何请求都会匹配到 @ 内部服务跳转
没有修饰符 表示:必须以指定模式开始 location / { root /usr/share/nginx/html; index index.html; }
= 表示:必须与指定的模式精确匹配 location = /test/index.html { root /usr/share/nginx/html; index index.html; }
~ 表示:指定的正则表达式要区分大小写 location ~ / { root /usr/share/nginx/html; index index.html; return 301 https://www.jd.com; }
~* 表示:指定的正则表达式不区分大小写 location ~* / { root /usr/share/nginx/html; index index.html; return 301 https://www.jd.com; }
^~ 表示:是以指定模式开始,匹配url路径 location ^~ /test/index.html { root /usr/share/nginx/html; index index.html; }
@ 表示:定义命名location区段,这些区段客户段不能访问,只可以由内部产生的请求来访问,必须和try_files配合使用 #寻找/usr/share/nginx/html/index.html找不到就返回@error的值409 location / { root /usr/share/nginx/html; index index.html; try_files /index.htm @error; } location @error { return 409; }
location优先级
带有“=“的精确匹配优先 没有修饰符的精确匹配 正则表达式按照他们在配置文件中定义的顺序 带有“^~”修饰符的,开头匹配 带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配 没有修饰符的,如果指定字符串与URI开头匹配
= 大于 ^~ 大于 ~|~*|!~|!~* 大于 / 多个location配置的情况下匹配顺序为:首先匹配 =,其次匹配^~, 其次是按正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。 ================================================ (1) =:表示完全匹配; (2) ^~:匹配URI的前缀,并且后面的正则表达式不再匹配,如果一个URI同时满足两个规则的话,匹配最长的规则; (3) ~:匹配正则表达式,大小写敏感; (4) ~*:匹配正则表达式,大小写不敏感; 优先级:(1)> (2) > (3) = (4)
root指令和alias指令的区别
alias 是一个目录别名的定义,
root 则是最上层目录的定义。
alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无
例如: location /img/ { alias /var/www/image/; } #若按照这种配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件 location /img/ { root /var/www/image; } #若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件