nginx部分配置格式
server {
listen 5000;
server_name www.liushuyu.top;
location /ccc/test {
proxy_pass http://119.91.100.32:6000/test;
}
}
server {
listen 6000;
server_name 119.91.100.32;
location /test/ {
alias /test/ ;
}
}
proxy_pass规则
1.proxy_pass不带url情况
-
1.1 如果
proxy_pass为http://119.91.100.32:6000 ,
location为/ccc/test/,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txtserver { listen 5000; server_name www.liushuyu.top; location /ccc/test/ { proxy_pass http://119.91.100.32:6000; } }
代理后的url为http://www.liushuyu.top:6000/ccc/test/aaa/bbb.txt
也就是说proxy_pass http://119.91.100.32:6000替换了http://www.liushuyu.top:5000 -
1.2 如果
proxy_pass为http://119.91.100.32:6000 ,
location为/ccc/test,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txtserver { listen 5000; server_name www.liushuyu.top; location /ccc/test { proxy_pass http://119.91.100.32:6000; } }
代理后的url为http://www.liushuyu.top:6000/ccc/test/aaa/bbb.txt
也就是说proxy_pass http://119.91.100.32:6000替换了http://www.liushuyu.top:5000 -
1.3 可支持正则表达式
proxy_pass为http://119.91.100.32:6000 ,
location为~ /.*/test/,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txtserver { listen 5000; server_name www.liushuyu.top; location ~ /.*/test/ { proxy_pass http://119.91.100.32:6000; } }
代理后的url为http://www.liushuyu.top:6000/ccc/test/aaa/bbb.txt
也就是说proxy_pass http://119.91.100.32:6000替换了http://www.liushuyu.top:5000
2.proxy_pass带url情况
-
2.1如果
proxy_pass为http://119.91.100.32:6000/ ,
location为/ccc/test/,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txtserver { listen 5000; server_name www.liushuyu.top; location /ccc/test/ { proxy_pass http://119.91.100.32:6000/; } }
代理后的url为http://www.liushuyu.top:6000/aaa/bbb.txt
也就是说proxy_pass http://119.91.100.32:6000/替换了http://www.liushuyu.top:5000/ccc/test/ -
2.2 如果
proxy_pass为http://119.91.100.32:6000/test/,
location为/ccc/test/,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txtserver { listen 5000; server_name www.liushuyu.top; location /ccc/test/ { proxy_pass http://119.91.100.32:6000/test/; } }
代理后的url为http://www.liushuyu.top:6000/test/aaa/bbb.txt
也就是说proxy_pass http://119.91.100.32:6000/test/替换了http://www.liushuyu.top:5000/ccc/test/ -
2.3 如果
proxy_pass为http://119.91.100.32:6000/test/,
location为/ccc/test,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txtserver { listen 5000; server_name www.liushuyu.top; location /ccc/test { proxy_pass http://119.91.100.32:6000/test/; } }
代理后的url为http://www.liushuyu.top:6000/test/aaa/bbb.txt
也就是说proxy_pass http://119.91.100.32:6000/test替换了http://www.liushuyu.top:5000/ccc/test -
2.4 如果
proxy_pass为http://119.91.100.32:6000/test,
location为/ccc/test/,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txtserver { listen 5000; server_name www.liushuyu.top; location /ccc/test/ { proxy_pass http://119.91.100.32:6000/test; } }
代理后的url为http://www.liushuyu.top:6000/testaaa/bbb.txt
也就是说proxy_pass http://119.91.100.32:6000/test替换了http://www.liushuyu.top:5000/ccc/test/ -
2.5 如果
proxy_pass为http://119.91.100.32:6000/test ,
location为/ccc/test,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txtserver { listen 5000; server_name www.liushuyu.top; location /ccc/test { proxy_pass http://119.91.100.32:6000/test; } }
代理后的url为http://www.liushuyu.top:6000/test/aaa/bbb.txt
也就是说proxy_pass http://119.91.100.32:6000/test替换了http://www.liushuyu.top:5000/ccc/test -
2.6 如果
location后面是接的正则表达式,
则proxy_pass不能有url,否则会报错2021/05/27 10:12:41 [emerg] 23077#0: invalid location modifier "*~" in /etc/nginx/conf.d/5000.conf:9 2021/05/27 10:12:58 [emerg] 23116#0: "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/conf.d/5000.conf:10
总结
1.proxy_pass不携带url,如果proxy_pass只有【协议】://【ip或者域名】:【端口】,没有url("/“也是url),那么只会proxy_pass只会替换源请求的【协议】://【ip或者域名】:【端口】
2.proxy_pass携带了url(”/“也是url),且url以”/“结尾,则proxy_pass中的url都会替换掉location的url,并且无论location有没有”/"结尾,代理后的url都能正常访问
比如proxy_pass为http://119.91.100.32:6000/test/,
location为/ccc/test,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt,最后不会变成http://www.liushuyu.top:5000/test//aaa/bbb.txt,而是http://www.liushuyu.top:5000/test/aaa/bbb.txt
3.proxy_pass携带了url(“/“也是url),但url不是以”/“结尾,,则location如果结尾携带”/”,proxy_pass中的url都会替换掉location的url,代理后的url会少一根"/"
比如proxy_pass为http://119.91.100.32:6000/test,
location为/ccc/test/,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt,最后变成http://www.liushuyu.top:5000/testaaa/bbb.txt
4…proxy_pass携带了url(“/“也是url),但url不是以”/“结尾,,则location如果结尾携带”/”,proxy_pass中的url都会替换掉location的url,代理后的url正常
比如proxy_pass为http://119.91.100.32:6000/test,
location为/ccc/test,
访问的url为http://www.liushuyu.top:5000/ccc/test/aaa/bbb.txt,最后变成http://www.liushuyu.top:5000/test/aaa/bbb.txt
5.如果location后面是接的正则表达式,则proxy_pass不能有url,否则会报错
以下附带一个简单的伪代码
if proxy_pass不携带url:
proxy_pass中的内容替换原请求的【协议】://【ip或者域名】:【端口】,替换后的url正常
else proxy_pass携带url:
if proxy_pass携带的url以"/"结尾:
proxy_pass中的内容替换原请求的【协议】://【ip或者域名】:【端口】加上location的url,替换后的url正常
else proxy_pass携带的url不以"/"结尾:
if location的url以"/"结尾:
proxy_pass中的内容替换原请求的【协议】: // 【ip或者域名】:【端口】加上location的url, 替换后的url会少一根"/"
else:
proxy_pass中的内容替换原请求的【协议】://【ip或者域名】:【端口】加上location的url,替换后的url正常
else location的url是正则表达式:
nginx启动会报错
新领悟:
1.proxy_pass如果以域名+端口开头,以端口结尾,则只会替换源url中的域名+端口(可以理解为代理的是一台服务器)
2.proxy_pass如果以域名+端口开头,以"/“结尾,则会替换源url中的location+/(location中如果包含了”/“则不另外+/)(可以理解为代理的是一个目录)
3.proxy_pass如果以域名+端口开头,以”"结尾,则会替换源url中的location (可以理解为代理的是一个文件)