`
iwebcode
  • 浏览: 2009861 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Nginx路径匹配规则详解

阅读更多
  作者: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中将路径匹配分为两类:

  1. 前缀路径匹配,即前缀字符串定义的路径,如上配置文件中“/,/static/js/,/static/css/,/api,/trip/”
  2. 正则表达式路径匹配,即使用正则表达式需要在路径开始添加“~*”前缀 (不区分大小写),或者“~”前缀(区分大小写)。如上配置文件中“/\.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 匹配规则,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Nginx Location指令URI匹配规则详解小结

    主要介绍了Nginx Location指令URI匹配规则详解小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Nginx配置之location的匹配优先级浅析

    主要给大家介绍了关于Nginx配置之location的匹配优先级的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    Nginx中if语句的判断条件与多条件判断详解

    一、if语句中的判断条件(nginx)介绍 1、正则表达式匹配:  ==:等值比较;  ~:与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;  ~*:与指定正则表达式模式匹配时返回“真”,判断匹配...

    详解Nginx之Location配置(Location匹配顺序)

    location有”定位”的意思, 主要是根据Uri来进行...^~:如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。 2.location如何发挥作用 3.简单实例证明上述图片结论 不带正则表达式的

    如何利用nginx通过正则拦截指定url请求详解

    匹配规则 location / { if ($request_uri ~* ^/\?http(.*)$) { return 404; } } 经过这样的匹配,我们就可以拦截所有请求根目录的网址并且参数为?httpxxx类似的请求都会显示404. 防盗链 返回http代码,例如设置...

    Nginx一个域名访问多个项目的方法实例

    location模块的匹配介绍 1.”=”前缀指令匹配,如果匹配成功,则停止其他匹配。 2.普通字符串指令匹配,顺序是从长到短,匹配成功的location如果使用^~,则停止其他匹配(正则匹配)。 3.正则表达式指

    详解Nginx Location配置

    今天有一位同学问到 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服务器中的nginx.conf配置文件

    Nginx 配置文件主要分成四部分:main(全局设置)、http(HTTP 的通用设置)、server(虚拟主机设置)、location(匹配 URL 路径)。还有一些其他的配置段,如 event,upstream 等。 通用设置  user nginx  指定...

    Nginx下配置pathinfo及ThinkPHP的URL Rewrite模式支持

    打开Nginx的配置文件 /usr/local/nginx/conf/nginx.conf 一般是在这个路径,根据你的安装路径可能有所变化。如果你配置了vhost,而且只需要你这一个vhost支持pathinfo的话,可以直接打开你的vhost的配置文件。找到...

    利用nginx搭建静态资源服务器的方法步骤

    注意:如果当前server模块中已有一个location且URL为“/”,那么新建的location的url应为匹配路径,不得再为“/”,此时,映射路径可不是随便写的,首先是你的root目录下面必须有这个URL目录,否则会报

    Nginx下实现pathinfo及ThinkPHP的URL模式

    打开Nginx配置文件(不同版本的Nginx可能稍有不同),配置: #去掉$是为了不匹配行末,即可以匹配.php/,以实现pathinfo #如果不需要用到php后缀,也可以将其去掉 location ~ .php { #原有代码 #定义变量 $path_...

    详解proxy_pass根据path路径转发时的”/”问题记录

    在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/。当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。...

    详解vue填坑之解决部分浏览器不支持pushState方法

    前端使用vue-router做单页面路由并开启history模式时,会... nginx对域名下的路径访问均重写向至index.html 以下为具体实现方法: 判断使用何种路由模式 let isHans = typeof (history.pushState) === 'function';

Global site tag (gtag.js) - Google Analytics