Nginx Location配置详解

Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

默认Nginx.conf配置文件中至少存在一个location /,即表示客户端浏览器请求的URL为:域名+/,如果location /newindex/,则表示客户端浏览器请求的URL为:域名+/newindex/。常见Location匹配URL的方式如下:

其中Location =、^~、/属于普通字符串匹配,Location ~、~*属于正则表达式匹配,Location优先级与其在Nginx.conf配置文件中的先后顺序无关。

Location = 精确匹配会第一个被处理,如果发现精确匹配,Nginx则停止搜索其他任何Location的匹配。

普通字符匹配,正则表达式规则和完整URL规则将被优先和查询匹配,^~为最大前缀匹配,如果匹配到该规则,Nginx则停止搜索其他任何Location的匹配,否则nginx会继续处理其他location指令。

正则匹配"~"和"~*",如果找到相应的匹配,则Nginx停止搜索其他任何Location的匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

Location规则匹配优先级总结如下:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~|~* 正则顺序) > (location 部分起始路径) > (location  /)

案例:

location  = / {
   [ configuration  L1 ] 
#只会匹配/,优先级比Location /低。
 }
 location  = /index.html {
   [ configuration  L2 ]  
 只会匹配/index.html,优先级最高。
 }
 location  / {
   [ configuration L3 ] 
   #匹配任何请求,因为所有请求都是以"/"开始;
   #但是更长字符匹配或者正则表达式匹配会优先匹配,优先级最低。
 }
 location = /images/ {
   [ configuration L4 ] 
   #匹配任何以/images/开始的请求,并停止匹配其它location;
 }
 location ~* .(html|txt|gif|jpg|jpeg)$ { 
   [ configuration L5] 
   # 匹配以html、txt、gif、jpg、jpeg结尾的URL文件请求; 
   # 但是所有/images/目录的请求将由 [Configuration L4]处理。
 }
 浏览器发起HTTP Request URI案例与Location规则案例匹配如下:
 / ->匹配configuration L3;
 /index.html匹配configuration L2;
 /images/匹配configuration L4;
 /images/logo.png匹配configuration L4;
 /img/test.jpg匹配configuration L5。

企业生产环境中无需在Nginx.conf配置文件中同时添加五种规则匹配,如下为企业生产环境Nginx Location部分配置代码:

location /
 {
     root /var/www/html/;
     expires      60d;
 }

 location ~ ..(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ 
{
     root /var/www/html/;
     expires      60d;       
}

 location ~ ..(jsp|php|cgi|do)$
 {
     root /var/www/html/;
     proxy_pass http://linux_web;
     proxy_http_version 1.1;
     proxy_set_header Connection "";
    proxy_set_header Host  $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }
 location =/newindex.html
 {
     root /var/www/newwww/;
     expires      60d;
 }

发表评论

后才能评论