nginx location and proxy_pass
Nginx的location的格式为
location [=|~|~*|^~] uri { … }
=
表示完全匹配uri^~
表示以uri打头~
表示正则匹配uri,且不区分大小写~*
表示正则匹配uri,但是区分大小写
Nginx匹配location时,有一定的优先级,=
优先级最高,其次^~
,最后是~
和~*
。同一类型的匹配按照出现的先后顺序匹配。
下面是一个例子,来自http://wiki.nginx.org/HttpCoreModule#location
location = / {
# matches the query / only.
[ configuration A ]
}
location / {
# matches any query, since all queries begin with /, but regular
# expressions and any longer conventional blocks will be
# matched first.
[ configuration B ]
}
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
# Configuration C.
[ configuration D ]
}
不同请求的结果如下:
- / -> configuration A
- /documents/document.html -> configuration B
- /images/1.gif -> configuration C
- /documents/1.jpg -> configuration D
=
和^~
都算字符常量匹配,而~
和~*
算正则匹配。这个在下面的proxy_pass需要用到。
proxy_pass的格式为:
location match {
proxy_pass target
}
proxy_pass的参数target由两部分组成,服务器地址和路径。如:
http://baidu.com
的服务器地址server为http://baidu.com
,path路径为空http://baidu.com/
的服务器地址server为http://baidu.com
,路径path为/
http://baidu.com/search
的服务器地址server为http://baidu.com
,路径path为/search
location的参数match为需要匹配到路径,它将一个URL分成了两部分,一部分是需要匹配的match,还有是剩下的left。如
location ~ /search {}
分别用不同的URL去匹配,得到的结果是
/search
match为/search
,left为空/search/
match为/search
,left为/
/serach/picture
match为/search
,left为/picture
当将这两个结合在一起跳转时,跳转的地址为:
- match 不为正则表达时:
- path 为空时:server + match + left
- path 不为空时:server + path + left
- match 为正则表达时,proxy_pass的参数必须只包含服务器地址,而不能有路径,地址为:server + match + left
下面是一个最普通的例子:
location /a {
proxy_pass http://cc;
}
location /b {
proxy_pass http://cc/;
}
location /c/ {
proxy_pass http://cc;
}
location /d/ {
proxy_pass http://cc/;
}
分别用不同的URL去请求,跳转地址为:
- /a/e -> http://cc/a/e
- /b/e -> http://cc//e
- /c/e -> http://cc/c/e
- /d/e -> http://cc/e