一、alias和proxy_pass介绍
一般情况下,前端包等静态资源可以使用alias来设置;后端的api接口可以使用proxy_pass来设置。一个简单的前后端分离的系统就可以通过这两个关键字完成配置。
#一般用来访问前端包等静态资源,alias 直接访问本机的资源
location ^~ /local-res/{
alias /usr/local/nginx/html/local-res/
index index.html index.htm;
}
#一般用来访问后端api接口等,proxy_pass把请求转发到其他服务,访问远程资源(当然也可以还是转到本机的另一个服务端口)
location ^~ /remote-res/{
proxy_pass http://192.168.1.1:8080/remote-res/
}
二、location后的路径
首先location后面的路径是为了匹配,如果和请求传来的url可以匹配并优先级较高则会采用这个location中的逻辑(使用这个location大括号中的处理方式)。
1. 判断是否匹配
- ^~ : 非正则匹配,表示普通字符匹配。表示阻断匹配不再向下继续匹配,得到的最长的location不是 ^~ 类型则继续匹配;(一般最常用)
- / : 普通匹配(/xxx);
- ~ : 表示正则匹配,区分大小写;
- ~* : 表示正则匹配,不区分大小写;
- @ : “@” 定义一个命名的 location,使用在内部定向时,例如 error_page;
- = : 完全匹配,精确匹配后面的url。
2. 判断优先级
- =:严格匹配,若有严格匹配成功,则优先级最高;
- / 或 ^~:普通匹配,哪个匹配的更长,哪个优先级高;
- ~ 或~*:正则匹配,按照在配置文件中从上倒下的顺序,上面的优先级高。
3. 另外
在包含alias关键字的location语句后的路径一般都会以“/”结尾,为了避免“穿越目录漏洞”。因为如果location后面的路径没有以“/”结尾,如下图所示。那么当用户输入xxx.com/example…/的时候,会被解析到/usr/local/nginx/html/…,导致“穿越目录漏洞”的出现。
location ^~ /example{
alias /usr/local/nginx/html/
index index.html index.htm;
}
三、proxy_pass或alias后的路径
- proxy_pass和alias后面添加什么
proxy_pass后面添加的“域名/ip+端口号”,代表本地或者远程的某个服务进程;而alias后面是本地的路径,代表着本地的资源。 - proxy_pass的斜杠“/”问题
以下例子均以访问 http://192.168.0.1:8080/example/test.html ,192.168.0.1:8080所对应的nginx会把这个请求转发给192.168.0.2:8080 为例。
如果proxy_pass只包含了ip(或域名)和端口号,所以转发的时候会拼接上location的路径,如:
#以下这个例子会拼接“/example/”,所以转发到的url为http://192.168.0.2:8080/example/test.html
location /example/ {
proxy_pass http://192.168.0.2:8080;
}
如果proxy_pass 不仅包含 了ip(或域名)和端口号还 包含了其他路径(即使只多了一个“/”也算,因为“/”也是根路径),所以转发的时候会不会拼接上location的路径,如:
#以下这个例子除了ip和域名还有“/”,所以不会拼接“/example/”,则转发到的url为http://192.168.0.2:8080/test.html
location /example/ {
proxy_pass http://192.168.0.2:8080/;
}
#以下这个例子除了ip和域名还有“/abc”,所以不会拼接“/example/”,则转发到的url为http://192.168.0.2:8080/abctest.html
location /example/ {
proxy_pass http://192.168.0.2:8080/abc;
}
#以下这个例子除了ip和域名还有“/abc/”,所以不会拼接“/example/”,则转发到的url为http://192.168.0.2:8080/abc/test.html
location /example/ {
proxy_pass http://192.168.0.2:8080/abc/;
}
#以下这个例子除了ip和域名还有“/example”,所以不会拼接“/example/”,则转发到的url为http://192.168.0.2:8080/example/test.html
location /example/ {
proxy_pass http://192.168.0.2:8080/example/;
}