作者:zhanhailiang 日期:2013-02-01
本节要讨论Nginx如何为一个请求选择匹配的location进行处理。
如下配置文件:
server {
listen 80 default_server;
server_name itravel.smartcom.cc itravel-beta.huawei.com;
client_max_body_size 8M;
server_tokens off;
root /data/web/itravel2.smartcom.cc/trunk/htdocs;
error_page 404 /404.htm;
error_page 500 502 503 504 /50x.htm;
location / {
#root /data/web/itravel2.smartcom.cc/trunk/htdocs;
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.+)\.html$ $1.php last;
}
}
location /static/js/ {
#root /data/web/itravel2.smartcom.cc/trunk/htdocs;
concat on;
concat_types text/javascript;
}
location /static/css/ {
#root /data/web/itravel2.smartcom.cc/trunk/htdocs;
concat on;
concat_types text/css;
}
location /api { }
location ~/\.ht { }
location ~ ^/~([^/]+)(/?.*)$ { }
location ~ \.do$ { }
location ~ \.(jpg|jpeg|gif|png|ico|css|tgz|gz|bz2|pdf|txt|tar|bmp|js|mov) { }
location ~ /trip/ { }
location /trip/ { }
location ~ \.php$ { }
}
第一步:请求URI(路径)规范化。
所谓规范化,就是先将URI中形如“%XX”的编码字符进行解码,再解析URI中的相对路径“.”和“..”部分, 另外还可能会压缩相邻的两个或多个斜线成为一个斜线。
举例说明:若REQUEST_URI为//trip/t.php,则规范化后为/trip/t.php,Nginx将规范前的值存放在$request_uri中,而规范化后的值存放在$uri中。
其中,$request_uri和$uri为Nginx内嵌变量。
第二步:请求URI路径匹配。
首先需要明确Nginx中将路径匹配分为两类:
-
前缀路径匹配,即前缀字符串定义的路径,如上配置文件中“/,/static/js/,/static/css/,/api,/trip/”
-
正则表达式路径匹配,即使用正则表达式需要在路径开始添加“~*”前缀 (不区分大小写),或者“~”前缀(区分大小写)。如上配置文件中“/\.ht,^/~([^/]+)(/?.*)$,\.do$,/trip/,\.php$,\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar||bmp|rtf|js|mov)”
其次为了根据请求URI查找路径,需要明确路径匹配的顺序:
Nginx首先检查前缀字符串定义的路径 (前缀路径),在这些路径中找到能最精确匹配请求URI的路径。然后Nginx按在配置文件中的出现顺序检查正则表达式路径,匹配上某个路径后即停止匹配并使用该路径的配置,否则使用最大前缀匹配的路径的配置。
举例说明:请求/trip/t.php,首先进行前缀路径匹配,最精确的前缀路径为/trip/,接下来进行正则表达式匹配,匹配到\.php$,从而进行location ~ \.php$ { }处理请求。反之若请求的是/trip/t.html,由于没有正则表达式匹配到该URI,故匹配最精确的前缀路径匹配,即进入location /trip/ { }处理请求。若想不论是请求/trip/t.php,还是/trip/t.html,都匹配到/trip/进行处理,则可以使用location ^~ /trip/ { },这样Nginx就不会再检查正则表达式了。
备注:
路径可以嵌套,但有例外。在不区分大小写的操作系统(诸如MacOSX和Cygwin)上,前缀匹配忽略大小写(0.7.7)。但是,比较仅限于单字节的编码区域(one-byte locale)。正则表达式中可以包含匹配组(0.7.40),结果可以被后面的其他指令使用。如果最大前缀匹配的路径以“^~”开始,那么Nginx不再检查正则表达式。
在0.7.1到0.8.41的所有Nginx中,如果请求匹配的前缀字符串路径并没有“=”或“^~”前缀, 路径查找过程仍然会停止,而不进行正则表达式匹配。
而且,使用“=”前缀可以定义URI和路径的精确匹配。如果发现匹配,则终止路径查找。 比如,如果请求“/”出现频繁,定义“location = /”可以提高这些请求的处理速度, 因为查找过程在第一次比较以后即结束。这样的路径明显不可能包含嵌套路径。
扩展阅读:
分享到:
相关推荐
本篇文章主要介绍了Nginx location 匹配规则,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Nginx Location指令URI匹配规则详解小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要给大家介绍了关于Nginx配置之location的匹配优先级的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
一、if语句中的判断条件(nginx)介绍 1、正则表达式匹配: ==:等值比较; ~:与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写; ~*:与指定正则表达式模式匹配时返回“真”,判断匹配...
location有”定位”的意思, 主要是根据Uri来进行...^~:如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。 2.location如何发挥作用 3.简单实例证明上述图片结论 不带正则表达式的
匹配规则 location / { if ($request_uri ~* ^/\?http(.*)$) { return 404; } } 经过这样的匹配,我们就可以拦截所有请求根目录的网址并且参数为?httpxxx类似的请求都会显示404. 防盗链 返回http代码,例如设置...
location模块的匹配介绍 1.”=”前缀指令匹配,如果匹配成功,则停止其他匹配。 2.普通字符串指令匹配,顺序是从长到短,匹配成功的location如果使用^~,则停止其他匹配(正则匹配)。 3.正则表达式指
今天有一位同学问到 Nginx 的站点多路径匹配的问题? 1.www.domain.com/a 需要返回 /var/www/domain.com/a/index.html 2.www.domain.com/b 需要返回 /var/www/domain.com/b/index.html 如何配置 Nginx 使之生效? ...
Nginx 配置文件主要分成四部分:main(全局设置)、http(HTTP 的通用设置)、server(虚拟主机设置)、location(匹配 URL 路径)。还有一些其他的配置段,如 event,upstream 等。 通用设置 user nginx 指定...
打开Nginx的配置文件 /usr/local/nginx/conf/nginx.conf 一般是在这个路径,根据你的安装路径可能有所变化。如果你配置了vhost,而且只需要你这一个vhost支持pathinfo的话,可以直接打开你的vhost的配置文件。找到...
注意:如果当前server模块中已有一个location且URL为“/”,那么新建的location的url应为匹配路径,不得再为“/”,此时,映射路径可不是随便写的,首先是你的root目录下面必须有这个URL目录,否则会报
打开Nginx配置文件(不同版本的Nginx可能稍有不同),配置: #去掉$是为了不匹配行末,即可以匹配.php/,以实现pathinfo #如果不需要用到php后缀,也可以将其去掉 location ~ .php { #原有代码 #定义变量 $path_...
在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/。当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。...
前端使用vue-router做单页面路由并开启history模式时,会... nginx对域名下的路径访问均重写向至index.html 以下为具体实现方法: 判断使用何种路由模式 let isHans = typeof (history.pushState) === 'function';