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就不会再检查正则表达式了。

备注:

路径可以嵌套,但有例外。
在不区分大小写的操作系统(诸如MacOS X和Cygwin)上,前缀匹配忽略大小写(0.7.7)。但是,比较仅限于单字节的编码区域(one-byte locale)。
正则表达式中可以包含匹配组(0.7.40),结果可以被后面的其他指令使用。
如果最大前缀匹配的路径以“^~”开始,那么Nginx不再检查正则表达式。
在0.7.1到0.8.41的所有Nginx中,如果请求匹配的前缀字符串路径并没有“=”或“^~”前缀, 路径查找过程仍然会停止,而不进行正则表达式匹配。

而且,使用“=”前缀可以定义URI和路径的精确匹配。如果发现匹配,则终止路径查找。 比如,如果请求“/”出现频繁,定义“location = /”可以提高这些请求的处理速度, 因为查找过程在第一次比较以后即结束。这样的路径明显不可能包含嵌套路径。

扩展阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx是一个高性能的HTTP和反向代理服务器,它可以通过配置文件来进行灵活的定制。在nginx中,反斜杠主要用于转义特殊字符,以便正确解析和处理请求。 以下是关于nginx反斜杠配置的一些详解: 1. 转义符号:在nginx配置文件中,使用反斜杠(\)作为转义符号。当需要使用特殊字符时,可以在其前面加上反斜杠,以避免对它们的解析错误。 2. 转义特殊字符:在nginx配置文件中,一些特殊字符需要进行转义,以确保它们被正确识别和处理。例如,如果要在一个location块中配置路径包含反斜杠(/)字符,可以使用反斜杠进行转义,如下所示: ``` location /path\/with\/slashes { ... } ``` 在这个例子中,路径"/path/with/slashes"中的每个斜杠都被反斜杠转义。 3. 转义正则表达式:在nginx的rewrite指令中,正则表达式是常见的用法之一。当需要在正则表达式中使用特殊字符时,同样需要进行转义。例如,如果要匹配含有点(.)的URL路径,可以使用反斜杠进行转义,如下所示: ``` location / { rewrite ^/path\.html$ /newpath.html; } ``` 在这个例子中,正则表达式中的点(.)被反斜杠转义,以确保它只匹配实际的点字符。 4. 转义URL:在nginx配置中,URL也可能需要进行转义。特别是在配置代理服务器时,可能会遇到一些特殊字符,如空格、问号等。使用反斜杠对这些字符进行转义,可以确保nginx正确地解析和处理URL。 这些是关于nginx反斜杠配置的一些详解,希望对你有所帮助。如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值