nginx 之 location “/” 匹配规则
前置测试访问域名:www.test.com/api/upload
1.location和proxy_pass都带/
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
访问地址:www.test.com/api/upload --> http://127.0.0.1:8080/upload
2.location不带/,proxy_pass带/
location /api {
proxy_pass http://127.0.0.1:8080/;
}
访问地址: www.test.com/api/upload --> http://127.0.0.1:8080//upload
3.location带/,proxy_pass不带/
location /api/ {
proxy_pass http://127.0.0.1:8080;
}
访问地址: www.test.com/api/upload --> http://127.0.0.1:8080/api/upload
4.location和proxy_pass都不带/
location /api {
proxy_pass http://127.0.0.1:8080;
}
访问地址: www.test.com/api/upload --> http://127.0.0.1:8080/api/upload
5.同1,但 proxy_pass带地址
location /api/ {
proxy_pass http://127.0.0.1:8080/server/;
}
访问地址: www.test.com/api/upload --> http://127.0.0.1:8080/server/upload
6.同2,但 proxy_pass带地址
location /api {
proxy_pass http://127.0.0.1:8080/server/;
}
访问地址: www.test.com/api/upload --> http://127.0.0.1:8080/server//upload
7.同3,但 proxy_pass带地址
location /api/ {
proxy_pass http://127.0.0.1:8080/server;
}
访问地址: www.test.com/api/upload --> http://127.0.0.1:8080/serverupload
8.同4,但 proxy_pass带地址
location /api {
proxy_pass http://127.0.0.1:8080/server;
}
访问地址: www.test.com/api/upload --> http://127.0.0.1:8080/server/upload
nginx之 root 和alias
最基本的区别:
alias指定的目录是准确的该目录
root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。
(1) . alias虚拟目录配置中,location匹配的path目录如果后面不带"/“,那么访问的url地址中这个path目录后面加不加”/“不影响访问,访问时它会自动加上”/“;
但是如果location匹配的path目录后面加上”/“,那么访问的url地址中这个path目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/“,访问就会失败!
(2) . root目录配置中,location匹配的path目录后面带不带”/",都不会影响访问。
所以,一般情况下,在nginx配置中的良好习惯是:
1)在location /中配置root目录;
2)在location /path中配置alias虚拟目录。
#经上面介绍可得知,alias 受 location以及url的 “/” 影响,但是root 不受影响
### alias 正确用法
location /img/ {
alias /root/data/img/;
}
或者
location /img {
alias /root/data/img;
}
这里location 带 / 下面的url也要带。 location不带 / 下面也不能带
#访问 ip+port/img/test.jpg --> /root/data/img/test.jpg
### alias 错误用法
location /img/ {
alias /root/data/img;
}
或者
location /img {
alias /root/data/img/;
}
#结果都是404.
-------------------------------------------------------------------------
### root 错误用法
location /img/ {
root /root/data/img/;
}
#访问 ip+port/img/test.jpg --> /root/data/img/img/test.jpg
### root 正确用法
location /img/ {
root /root/data/; #这里前提是该目录下有img这个子目录
}
或者
location / {
root /root/data/img/;
}
#访问ip+port/img/test.jpg --> /root/data/img/test.jpg 推荐使用第二种可以灵活变换目录
nginx之 location正则匹配(“=”,"^“,”"等)
匹配规则:
location 路径正则匹配规则:location [ = | ~ | ~* | ^~ | !~ | !~* ] /uri/{…}
-
= 表示精确匹配
-
~ 表示区分大小写正则匹配
-
~* 表示不区分大小写正则匹配
-
^~ 表示URI以某个常规字符串开头
-
!~ 表示区分大小写正则不匹配
-
!~* 表示不区分大小写正则不匹配
-
/ 通用匹配,任何请求都会匹配到
匹配顺序
多个location配置的情况下匹配顺序为:
1、首先匹配 =
2、其次匹配 ^~
3、其次是按文件中顺序正则匹配
4、最后交给通用 / 匹配
当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
常用规则
1、精确匹配
location = / {
proxy_pass http://127.0.0.1:9000;
}
将所有请求直接转发给服务器的9000端口。
2、处理静态文件
目录匹配
location ^~ /static/ {
root /data/app/static;
}
后缀匹配
location ~* .(gif|jpg|jpeg|png|css|js|ico)$ {
root /data/app/static;
}
3、转发动态请求到后端应用服务器
将api开始的请求转发给后端8080端口
location /api {
proxy_pass http://127.0.0.1:8080;