首页 > 代码库 > nginx之location匹配规则

nginx之location匹配规则

1.概述

 Nginx server块下的一个指令,每个server块可以包含多个location块。

2.作用

1)基于Nginx服务器接收到的请求字符串(例如:server_name/usr-string),对除虚拟主机名称(也可以是ip别名)之外的字符串(例如:“/usr-string”)进行匹配,对特定的匹配进行处理;

2)地址定向、数据缓存和应答控制等功能都是在这部分实现;

3)许多第三方模块的配置也是在location块中提供功能。

3.语法结构

Location [ = | ~ | ~* | ^~ ] uri{  }

1)uri变量是待匹配的请求字符串,可以是不包含正则表达的字符串,也可以是包含正则的字符串。为了叙述方便,约定下文中,不含正则表达的uri称为“普通uri”,包含正则表达的uri称为“正则uri”。

2)方括号的部分是可选项,用来改变请求字符串与uri的匹配方式

= 用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求

~ 用于表示uri包含正则表达式,并且区分大小写

~* 用于表示uri包含正则表达式,并且不区分大小写

^~ 用于普通uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。当浏览器在传送URI时会对一部分字符进行URL编码,比如空格被编码为“%20”,问号被编码为“%3f”等。^~有一个特点就是它会对uri中的这些符号进行编码处理。比如,如果location块收到的URI/html/%20/data,则当nginx服务器搜索到配置为“^~/html/ /data”的location时,可以匹配成功。

4.规则

“普通uri”和“普通uri”:先是严格匹配,然后是最大前缀匹配。“普通uri”的执行逻辑跟location编辑顺序无关。

“正则uri”和“正则uri”:按照正则uri在匹配文件中的物理顺序(编辑顺序)匹配的,只要匹配到一条“uri”,就不再考虑后面的。

“普通uri”和“正则uri”:选择出“普通uri”的最大前缀匹配结果后,还需要继续搜索“正则uri”;搜索到“正则uri”,那么“正则uri”覆盖“普通uri”,但也可以告诉nginx,匹配到了“普通uri”后,不需要继续匹配“正则uri”,只需要在“普通uri”前面加上“^~”符号或者是“=”;不同点是“^~”依然遵循“最大前缀”匹配规则,然后“=”不是最大匹配,而是必须严格匹配(exact match)、只要遇到“精确匹配exact match”,即使普通location没有带“=”或“^~”前缀,也一样会终止后面的匹配。

/me /me/的区别

1:普通匹配时,前者是文件,后者是目录,精确匹配/me/

2:正则匹配/me/时,/me不匹配,正则匹配/me时,/me/是可以匹配出来的。

注意:(1)正则匹配可以不写root路径,不写的话就是匹配任何路径。

     2)“正则uri”让步于“普通uri”的严格精确匹配结果;但覆盖“普通uri”的最大前缀结果。

5.配置案例

Web服务器接收到网络请求之后,首先要在服务器端指定目录中寻找请求资源。在nginx

务器中,指令root就是用来配置这个根目录的。其语法结构为

Root   path;        //pathnginx服务器接收到请求以后查找资源的根目录路径

例:配置请求的根目录

Web服务器接收到网络请求之后,首先要在服务器端指定目录中寻找请求资源。在nginx

务器中,指令root就是用来配置这个根目录的,其语法结构为:

Location  /zhang/

{

    Root  /wang;

}

location块收到“/zhang/index.html”的请求后,将在/wang/zhang/目录下找index.html

响应请求。

 

例:更改locationuri

location块中,除了使用root指令请求处理目录,还可以使用alias指令改变location接收

到的URI的请求路径,其语法结构为:

Alias path;                                       //path为修改后的根路径

Location ~ ^/zhang/(.+\.(htm|html))$

{

    Alias /yang/other/

}

location块收到“/zhang/index.html”的请求时,匹配成功。之后根据alias指令的配置,

Nginx服务器将到/yang/other/目录下寻找index.html。可以看到,通过alias的指令,根路径

已经从/zhang/yang/other了。

 

例:配置网站的默认首页

指令index用来设置网站的默认首页,他一般可以有两个作用:一是,用户在发出请求访问

网站时,请求地址可以不写首页名称;二是,可以对一个请求,根据其请求内容而设置不同

的首页。该指令的语法结构为:

Index file ..;

File可以包含多个文件名 ,其间使用空格分隔,也可以包含其它变量。此变量默认为

index.html”。

例:

Location ~ ^/data/(.+)/web/ $

{

   Index index.$1.html  index.zhang.html  index.html

}

location块接收到“/data/locationtest/web/“时,匹配成功,它首先将预置变量$1置为”

locationtest“,然后在/data/locationtest/web/路径下按照index的配置次序依次寻找index.loca

tiontest/web/路径下按照index的配置次序依次寻找index.locationtest.html页、

index.zhang.html页和index.html页,首先找到哪个页面,就使用哪个页面响应请求。

 

设置网站的错误页面

如果用户尝试查看网页时遇到问题,服务器会将HTTP错误从网站发送到web浏览器。如果

无法显示页面,web服务器会显示网站发送的实际错误网页或web浏览器内置的友好错误

信息。Nginx服务器支持自定义错误网页的显示内容。可以通过这一功能在网站发生错误时

为用户提供人性化的错误显示页面。

一般来说,HTTP2XX代表请求正常完成,HTTP3XX代表网站重定向,HTTP4XX代表客户端出

现错误,HTTP5XX代表服务器端出现错误。

Nginx服务器设置网站错误页面的指令为error_page,语法结构为:

Error_page code  [=[response]] uri

Code,要处理的HTTP错误代码

Response,可选项,将code指定的错误代码转化为新的错误代码response

Uri,错误页面的路径或者网站地址。如果设置为路径,则是以nginx服务器安装路径下的

Html目录为根路径的相对路径;如果设置为网址,则nginx服务器会直接访问该网址获取错

误页面,并返回给用户端。

例:

Error_page  404  /404.html

设置nginx服务器使用“nginx安装路径/html/404.html”页面响应404错误。

Error_page  403  http://somewebsite.com/forbidden.html

设置nginx服务器使用http://somewebsite.com/forbidden.html页面响应403错误。

Error_page 410 =310  /empty.gif

设置nginx服务器产生404HTTP消息时,使用“nginx安装路径/html/empty.gif”返回给

用户端301消息(“已移动消息”)。

在前面error_page指令的分析中我们看到,变量uri实际上是一个相对于nginx服务器安装

路径的相对路径。如过不想将错误页面放到nginx服务器的安装路径下管理,可以使用另外

一个location指令定向错误页面到新的路径下面。

例:

Error_page  404  /404.html

Location  /404.html

{

   Root /myserver/errorpages/

}

首先捕获/404.html”请求,然后将请求定向到新的路径下面即可。

公司案例

原始配置:

    location / {

        root   /usr/share/nginx/html;

        index  index.html index.htm;

}                                           //配置项目首页,指定路径

 

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {

        root   /usr/share/nginx/html;

    }                                        //配置5XX错误页面,重新定向

 

    location  /media/

    {

        root         /data/static;

        expires      30d;

    }                                       //配置匹配/media/location

 

    location  /forum/

    {

         root        /data/static;

    }                                     //配置匹配/forum/location

 

    location /zhang/

    {

        proxy_pass http://127.0.0.1:8080;

        proxy_redirect off;

        proxy_set_header HOST $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        client_max_body_size 10m;

        client_body_buffer_size 128k;

        #proxy_connect_timeout 90;

        #proxy_send_timeout 90;

        #proxy_read_timeout 90;

        #proxy_buffer_size 4k;

        #proxy_buffers 4 32k;

        #proxy_busy_buffers_size 64k;

        #proxy_temp_file_write_size 64k;

    }                                     //配置匹配/zhang/location块,将请求直接丢给后端tomcat

 

    location ~ .*\.(js|css)?$

    {

        expires      1h;

    }                                    //将所有js|cs文件缓存到浏览器1小时

}

问题:当在浏览器输入http://xx.xx.xx.xx/zhang/imsgTest.jsp,会出现404的错误


本文出自 “庭中有奇树” 博客,请务必保留此出处http://zhangdl.blog.51cto.com/11050780/1869524

nginx之location匹配规则