nginx 'proxy_pass'在位置中不能有URI部分?

zi8p0yeb  于 2023-03-07  发布在  Nginx
关注(0)|答案(4)|浏览(273)

我有一个location块作为

location @test{
    proxy_pass http://localhost:5000/1;
}

但是nginx抱怨"proxy_pass cannot have URI part in location given by regular expression..."有人知道可能出了什么问题吗?
我正在尝试在上传完成时查询localhost:5000/1:

location /upload_attachment {
    upload_pass @test;
    upload_store /tmp;
    ...
}
7hiiyaii

7hiiyaii1#

从技术上讲,只添加URI应该可以工作,因为这里有文档说明,它说它应该可以工作,所以

location @test{
    proxy_pass http://localhost:5000/1/; # with a trailing slash
}

应该可以正常工作,但既然你说不行,我建议反过来,诀窍是不是将/my/uri传递给localhost:5000/1,而是将/1/my/uri传递给localhost:5000
这就是我重写的剧本

rewrite ^ /1$1

意思是重写整个URL,在前面加上/1,然后加上剩下的,整个块变成

location @test{
    rewrite ^ /1$1;
    proxy_pass http://localhost:5000;
}

注意:@Fleshgrinder提供了一个答案,解释了为什么第一种方法不起作用。

z8dt9xmd

z8dt9xmd2#

这里到底发生了什么?

nginx无法处理proxy_pass指令中您想要的URI部分,因为您位于一个指定的位置(因此出现错误消息)。这是因为nginx是以模块化方式构建的,并且每个配置块在不同的阶段由不同的模块读取。所以请记住,在以下情况下,您不能在proxy_pass指令中包含URI:
1.正则表达式位置
1.指定位置

  1. if数据块

我们如何解决这个问题?

Mohammad AbuShady explained如何重写并将请求的URI传递到代理服务器。我只是想澄清原因。

siv3szwd

siv3szwd3#

尝试省略“/”(URI部分)并检查。

location @test{
    proxy_pass http://localhost:5000;
}
vu8f3i0k

vu8f3i0k4#

以上这些都帮不了我。
我的解决方法是:

location @cat {
    resolver 8.8.8.8 valid=30s;
    set $upstream https://upload.wikimedia.org/wikipedia/commons/5/53/Sheba1.JPG;
    proxy_pass $upstream;
}

请注意,resolver指令可能因上下文而异。

相关问题