在 nginx 中配置 proxy_pass 时,遇到了一些小坑,特加以说明,防止以后忘记。

proxy_pass http://backup/;

当加上了 / ,相当于是绝对根路径,nginx 不会把location 中匹配的路径部分代理走;

1
2
3
4
5
6
7
8
9
location ^~ /static/ 
{
# http://backup/。。。 不带location中的东西
# 只要proxy_pass后面有东西就不带location中的东西
proxy_pass http://www.test.com/;
}
# location中的匹配路径为/static/。加了/之后proxy_pass 不会加上/static/
# curl http://localhost:3000/static/index.html
# proxy_pass 转发为 http://www.test.com/index.html

proxy_pass http://backup;

如果没有/,则会把匹配的路径部分也给代理走。

1
2
3
4
5
6
7
8
location ^~ /static/ 
{
# 带上location中的东西
proxy_pass http://www.test.com;
}
# location中的匹配路径为/static/。不加 / 后proxy_pass会加上 /static/
# curl http://localhost:3000/static/index.html
# proxy_pass 转发为 http://www.test.com/static/index.html

用在 location 的正则匹配中的坑 。。。

location 中 ~ (区分大小写)与 ~* (不区分大小写)标识均为正则匹配,如果的话想在这里用的话,则 proxy_pass 中的 http://backup; 后面不能带有url。

如下写法会报错

1
2
3
4
5
location ~* /static/(.*)
{
# 此处 location 为正则匹配,proxy_pass 后面不能有 /test
proxy_pass http://www.test.com/test;
}

如果 http://backup; 不带url 。这么写是没有问题的

1
2
3
4
5
location ~* /static/(.*)
{
# 此处 location 为正则匹配,proxy_pass 后面不能有 /test
proxy_pass http://www.test.com;
}

在proxy_pass 中使用变量

proxy_pass中可以使用变量,但是如果变量涉及到域名的话 需要使用resolver指令解析变量中的域名(因为nginx一开始就会解析好域名)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
### 不涉及到域名变量
location ~* /aa/bb(.*) {
# 正常使用变量,注意此处为location的正则匹配 proxy_pass 不能带 /
# 转发后为 127.0.0.1:9999/test
proxy_pass http://backup$1;
}

### 涉及到域名的变量
location /aa/bb {
# google 域名解析
resolver 8.8.8.8;
# 此处变量涉及到了域名 需要调用resolver指令进行解析下否则会报错。
set $myhost "www.test.com";
proxy_pass http://$myhost;
}

rewrite 重写后的 url 会忽略proxy_pass后路径

1
2
3
4
5
6
7
8
9
10
11
12
# curl 127.0.0.1:8888/aa/bb/ccc
location /aa/bb {
rewrite /aa/bb(.*) /re$1 break;
proxy_pass http://backup;
}
# 转发后得到 127.0.0.1:9999/re/ccc
location /aa/bb{
rewrite /aa/bb(.*) /re$1 break;
# rewrite 重写后的 url 路径会 忽略 /asd 相当于 http://backup;什么都不带
proxy_pass http://backup/asd;
}
# 此处转发后同样得到 127.0.0.1:9999/re/ccc