root和alias的区别

root和alias都可以定义在location模块中,都是用来指定请求资源的真实路径,比如:

location /i/ {  
    root /data/w3;
}

请求 http://foofish.net/i/top.gif 这个地址时,那么在服务器里面对应的真正的资源

是 /data/w3/i/top.gif文件

注意:真实的路径是root指定的值加上location指定的值 。

而 alias 正如其名,alias指定的路径是location的别名,不管location的值怎么写,资源的 真实路径都是 alias 指定的路径 ,比如:

location /i/ {  
  alias /data/w3/;
}

同样请求 http://foofish.net/i/top.gif 时,在服务器查找的资源路径是: /data/w3/top.gif
其他区别:

1、 alias 只能作用在location中,而root可以存在server、http和location中。

 2、 alias 后面必须要用 “/” 结束,否则会找不到文件,而 root 则对 ”/” 可有可无。

location详解

location 指令是http模块中非常重要的配置指令之一,Location是Nginx中的块级指令(block directive),通过配置Location指令块,可以决定客户端发过来的请求URI如何处理(是映射到本地文件还是转发出去)及被哪个location处理

Location根据类型分为两种:普通配置和正则匹配

一、 普通配置

普通location根据使用方法又分为两种,格式如下:

1.  location  / {

命令序列

}

解释:括号中定义的表示对当前路径及子路径下的所有对象有效。“优先级最低”

用户所有的请求都能被它匹配到。

例子:

location / {       

              root /web; 

                相应策略     

    }

这说明网页根目录在/web
访问的时候直接http://127.0.0.1或是域名就可以了
用户所有的请求都能被它匹配到

location /bbs {
       root "/web";
         相应策略
}

这就说明网页根目录是位于 /web/bbs
访问的时候直接http://127.0.0.1/bbs就可以了
当用户访问http://127.0.0.1/bbs/
或是
http://127.0.0.1/bbs/子路径的时候才能被上边的路径匹配到。

问题:当用户访问http://127.0.0.1/bbs/a.html时

这两段location 同时存在时如下,那么哪段配置会生效呢?

server {
listen       80;
server_name  www.benet.com;
index index.html;
location  / {
        root /web;
}
location  /bbs {
        root /web;
}

结论就是,
当用户请求的(/bbs)url同时匹配到两段location时,
最大前缀生效(location /bbs生效)
如果没有这段(location /bbs)第一段生效。
第一段相当于默认策略,因为location / 包含所有的请求,所有的请求都是以 ”/” 开始的

2.  location = /路径 {

命令序列

}

解释:括号中定义的表示对当前路径有效,子路径不生效(精确匹配指定的路径不包括子路径)。“它的优先级最高。”

例子:

location = /prefix {

}

也就是用户访问www.benet.com/prefix能被上边的location匹配到,它只匹配"/prefix",

"/"下的子路不匹配。

用户访问www.benet.com/prefix/a 就不能被它匹配到

优先级最高:指的是一旦匹配到此location ,立即生效。其它location无论是否匹配到请求都不生效。

例子:

location  /prefix/ {

                root /;

        }

location  = /prefix/  {

               return 507;

       }

匹配顺序注解:
retrun 507

二、 正则匹配

正则匹配也分为两种:

  • location ~ URI {}

~匹配的文件是区分字符 大小写的

  • location ~* URI {} :

~*匹配的文件是不区分字符大小的

正则匹配是按照正则location编写的顺序生效的,一旦匹配成功即停止匹配到后续的location。

例子:
   location  ~ /bbs {
                return 400;
    }
   location ~* /bbs {
                return 500;
   }

网页返回错误信息400

然后将两段配置调换一下位置

location ~* /bbs {

                return 500;

        }

  location  ~ /bbs {

                return 400;

        }

return 500

三、匹配顺序和生效顺序

匹配顺序和生效顺序是两个概念

当配置中出现多个locaton并且普通和正则都有,那么

1、匹配顺序是:

用户请求的URL

(1)先匹配普通location

普通location在匹配是按照编辑顺序匹配

(2)在匹配正则location

正则location在匹配时按照编辑顺序匹配

但是正则和普通locaiton不按照编辑顺序匹配

2、生效顺序

当普通和正则都存在的情况下,遵循以下原则

nginx开始按照编辑顺序依次匹配普通location

(1)如果匹配过程中匹配到了

“location =” :nginx会立即生效即停止后续的匹配

(2)如果没有"locaiton ="话,

如果匹配到"locatin ^~"。会停止后续的正则匹配.然后此策略立即生效。

(3) 如果以上两种location都不存在的话

nginx会匹配所有location后看后续有没有正则locaion

如果后续没有正则locaiton

然后最大前缀locaiton生效

最后是location / 生效

如果后续还有正则location
一旦匹配成功一条正则locaion,这条会生效,并且会停止后续的正则匹配,还会会覆盖前边的普通location结果

( location = ) > ( location 完整路径 ) > ( location ^~ 路径 ) > ( location
 ,* 正则顺序 ) > ( location 部分起始路径 ) > ( / )

proxy_pass

在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。

假设下面四种情况分别用 http://192.168.1.1/proxy/test.html 进行访问。

第一种:location /proxy/ {
    proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html

第二种(相对于第一种,最后少一个 / )
location /proxy/ {
    proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html

第三种:location /proxy/ {
    proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/test.html

第四种(相对于第三种,最后少一个 / )
location /proxy/ {
    proxy_pass http://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaatest.html

参考:
http://wjhsh.net/pangbing-p-6956644.html