Nginx的location语法规则

一、介绍

location指令是http模块当中最核心的一项配置,根据预先定义的URL匹配规则来接收用户发送的请求,根据匹配结果,将请求转发到后台服务器、非法的请求直接拒绝并返回40三、40四、500错误处理等。html

二、location指令语法

location [=|~|~*|^~|@] /uri/ { … } 或 location @name { … }nginx

三、URI匹配模式

location指令分为两种匹配模式:正则表达式

  • 1> 普通字符串匹配:以=开头或开头无引导字符(~)的规则
  • 2> 正则匹配:以~或~*开头表示正则匹配,~*表示正则不区分大小写

四、location URI匹配规则

  • (1)当nginx收到一个请求后,会截取请求的URI部份,去搜索全部location指令中定义的URI匹配模式。
  • (2)在server模块中能够定义多个location指令来匹配不一样的url请求,多个不一样location配置的URI匹配模式,整体的匹配原则是:先匹配普通字符串模式(普通匹配,匹配到会暂存,继续搜索正则匹配),再匹配正则模式(正则模式匹配到,即为最终匹配)。只识别URI部份,例如请求为:/test/abc/user.do?name=xxxx 一个请求过来后,Nginx匹配这个请求的流程以下:
  • 先查找是否有=开头的精确匹配,如:location = /test/abc/user.do { … }
  • 再查找普通匹配,以最大前缀为原则,若有如下两个location,则会匹配后一项
location /test/ { … }
location /test/abc { … }
复制代码
  • 匹配到一个普通格式后,搜索并未结束,而是暂存当前匹配的结果,并继续搜索正则匹配模式
  • 全部正则匹配模式location中找到第一个匹配项后,就以此项为最终匹配结果 因此正则匹配项匹配规则,受定义的先后顺序影响,但普通匹配模式不会
  • 若是未找到正则匹配项,则以3中缓存的结果为最终匹配结果
  • 若是一个匹配都没搜索到,则返回404

五、精确匹配与模糊匹配差异

location =/ { … }location / { … } 的差异:缓存

  • 前一个是精确匹配,只响应/请求,全部/xxx或/xxx/xxxx类的请求都不会之前缀的形式匹配到它
  • 后一个是只要以 / 为前缀的请求都会被匹配到。如:/abc , /test/abc, /test/abc/aaaa

六、正则与非正则匹配

location ~ /test/.+.jsp$ { … } :正则匹配,支持标准的正则表达式语法。 location ^~ / { … } : ^~意思是关闭正则匹配,当搜索到这个普通匹配模式后,将再也不继续搜索正则匹配模式。bash

http {
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
            # deny all; 拒绝请求,返回403
            # allow all; 容许请求
        }

        location /abc {
            deny all;
        }

        location ~ /.+\.jsp$ {
            proxy_pass http://location:9090;
        }

        # 匹配全部/test路径下的jsp文件
        location ~ /test/.+\.jsp$ {
            proxy_pass http://localhost:8080;
        }

        # 定义各种错误页
        error_page 404  /404.html

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # @相似于变量定义
        # error_page 403 http://blog.csdn.net; #这种定义不容许,需求利用@定义临时变量来实现
        error_page 403 @page403;
        location @page403 {
            proxy_pass http://blog.csdn.net;
        } 
    }
}
复制代码
相关文章
相关标签/搜索