Nginx 位置代理传递问题

Nginx 位置代理传递问题

我不是 nginx 专家,所以如果任何信息缺失或不完整,请见谅。

我有一个在 http://server-ip:3000/abc/xyz 下运行的网站。该网站还从 http://server-ip:3000/assets 加载一些资产,但也从 http://server-ip:3000/abc/xyz/data 加载一些资产

我现在想将 mydomain.tld 映射到 http://server-ip:3000/abc/xyz

因此我有这些位置:

location / {
   proxy_pass http://upstream123/abc/xyz/;
}
location ~* /assets {
   proxy_pass http://upstream123;
}

我假设我还必须将数据文件夹映射为自己的位置,因为通过域访问时不会加载其内容(404):

location ~* /data {
   proxy_pass http://upstream123/abc/xyz/data;
}

我通过 OPNsense 完成所有这些操作,起初它接受了这一切。但这导致了一些问题,当尝试重新加载所有内容并测试 nginx 配置时,它告诉我: nginx: [emerg] "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 /usr/local/etc/nginx/nginx.conf:4532

我认为问题在于,对于根 (/) 位置,它已经以某种方式引用了更深的路径,这会导致在访问更下方的路径时出现问题? proxy_pass http://upstream123/data;不起作用,我已经尝试过了

我希望我能够足够详细地解释这个问题。

谢谢

答案1

我们应该从 OP 中假设 Nginx 包含上游块:

upstream upstream123 { 
    server server-ip:3000 ; 
    ...
}

我还将假设有一个服务器块来处理虚拟主机 mydomain.tld,如下所示:

server {
    listen 80;
    server_name mydomain.tld ;
    ...
}

在该服务器块中,人们会发现与上面相同的位置块。

我的问题是,同样的方法是否适用于/资产已经尝试过/数据

location ~* /data {
    proxy_pass http://upstream123 ;
    ...
}

默认情况下,这将请求包括 /data 在内的完整 uri,并将 /abc/xyz/data 或 /this/data/dir 甚至 /this/datadir 的请求代理到 服务器IP:3000,就像 /assets 的位置一样。如果这样不起作用,则应该解决另一个问题,而不是试图破坏 Nginx proxy_pass 指令。

在这种情况下,Nginx 重新加载会中断,因为您实际上是在尝试“重写”基于 Regex 的位置内的 uri 组件,而(细微的、内部的)Nginx 规则阻止了此操作,因为它无法正确解析。

我真正想说的是“为什么不提供没有 /abc/xyz 的所有 URI,而只是在您的公共 Web 目录中将其用作“静默”路径。

server {
    ...
    server_name mydomain.tld ;
    root /var/www/html/abc/xyz ;

    location / {
        proxy_pass http://upstream123 ;
        ...
    }

}

在这种情况下,预计应该从 /var/www/html/abc/xyz 的顶级目录找到任何路径,以便 Web 请求:http://mydomain.tld/my/image.jpg将尝试访问服务器资源:/var/www/html/abc/xyz/my/image.jpg

但是......我不想猜测你的理由,只是想让你知道还有其他方法可以处理经常预期的路径转换,让你的生活更轻松。

当然,这样做可能会产生其他不那么容易解决的问题,而这实际上取决于您的用例的细节......

相关内容