8

proxy_pass的小说明

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

proxy_pass http://backup/;

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

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;

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

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。

如下写法会报错

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

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

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

在proxy_pass 中使用变量

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

### 不涉及到域名变量
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后路径

# 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 

youyu岁月
489 声望46 粉丝

不要用执行上的勤奋来掩盖思考上的懒惰