教程集

nginx location 匹配用法

阅读:261;作者:loushiming

一般在 nginx 配置文件中我们会看到很多个 location ,而且写法也有很多花样,例如下面的配置

server
{
    listen       80;
    server_name  audit.xxxx.cn;
    index index.shtml index.html index.htm index.php;
    root  /data/xxx/Public;

    location / {
        if (!-e $request_filename) {
            rewrite ^(.*)$  /index.php last;
        }
    }
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    location ^~ /assets/ {
        try_files $uri = 404;
    }
    location ~ .*/\.(ht2|ht|htaccess|ini|cvf|svn|git|txt|conf|sh|py|pl|rb|cgi)$ {
        deny all;
    }
    location ~ \.php$ {
        fastcgi_pass  127.0.0.1:9001;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 30d;
        access_log off;
    }
    location ~* \.(js|css)?$ {
        expires 7d;
        access_log off;
    }
    access_log /var/log/access.log access;
}

那么问题来了,到底每种写法都是什么意思,那种匹配优先被执行,下面就来分析一下。

首先 location 的匹配命令有以下几种:

  • = 表示进行普通字符串精确匹配

  • ^~ 表示进行普通字符串匹配,如果匹配到该项,则结束匹配,一般用来匹配目录

  • ~ 表示进行一个正则匹配

  • ~* 表示进行一个正则匹配,不区分大小写

  • @ 这个符号用来定义个命名的 location,使用在内部重定向的时候,比如 error_page, try_files

nginx location 一般有以下几种用法(按处理顺序)

location = /tuto {
}

这种就是精确的字符串匹配,它会被首先处理,如果匹配到了,会停止检查其他的location 指令

location /tuto {
}

这种叫普通字符串匹配,这种匹配第二个被处理,但是这种匹配的优先级排在正则表达式规则之后,也就是说,即使匹配到了还需要检查下正则方式匹配的规则是否有匹配到的,以正则匹配到的结果优先,并且如果有更长的普通字符串匹配,则优先更长的匹配

location ^~ /tuto {
}

这种也是一种 普通字符串匹配 , 只不过在匹配到后会停止匹配其他的 location 指令

location ~ .php {

}
location ~* .(gif|jpg|jpeg)$ {
}

上面这两种就是不区分大小写的正则匹配


location ^~ /thumb/ {
    default_type image/jpeg;
    
    set $memcached_key "$uri";
    memcached_pass 127.0.0.1:1211;
    memcached_next_upstream error timeout invalid_response;
    memcached_connect_timeout 300ms;
    memcached_read_timeout 3s;
    memcached_send_timeout 1s;
    error_page     404 502 504 = @thumb;
}

location @thumb {
    internal;
    root /data/static/images;
}

上面的代码表示,如果在 memcache 找不到图片,会将请求转发到名称为 "thumb" 的location 中处理

(转载本站文章请注明作者和出处 教程集 – jiaochengji.com ,请勿用于任何商业用途)

上一篇: php 语法简单入门
下一篇: