nginx x-accel-redirect上“location”和“proxy_pass”的不同行为

时间:2017-02-09 12:15:25

标签: nginx x-accel-redirect

我的nginx就像:

location ^~ /mount_points/mount_point1 {
  internal;
  alias /repos/mount_point_one;
}

location ^~ /to_proxy {
  internal;
  proxy_pass http://myproxy:5000;
}

当我请求“http://localhost/mount_points/mount_point1/myfile.zip”时,我按预期得到“/repos/mount_point_one/myfile.zip”。

在请求“http://localhost/to_proxy/myfile2.html”时,我收到“http://myproxy:5000/to_proxy/myfile2.html”。

在第一种情况下,删除了“/ mount_points / mount_point1”部分,在第二种情况下,“/ to_proxy”部分仍然存在,我必须在上游服务器中伪造一个“/ to_proxy”地址来查找出这个。

我错过了什么吗?如果我只需要重写url,如何删除上游服务器的“/ to_proxy”部分问题?

谢谢。

1 个答案:

答案 0 :(得分:2)

proxy_pass指令可以执行别名功能,但仅在提供可选URI时才会执行。

location ^~ /to_proxy/ {
    internal;
    proxy_pass http://myproxy:5000/;
}

要使别名映射正常工作,还会在/参数中添加尾随location

有关详细信息,请参阅this document

如果/参数上的结尾location导致问题,您可以使用rewrite ... break代替:

location ^~ /to_proxy {
    internal;
    rewrite ^/to_proxy(?:/(.*))?$ /$1 break;
    proxy_pass http://myproxy:5000;
}