我不是 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
但是......我不想猜测你的理由,只是想让你知道还有其他方法可以处理经常预期的路径转换,让你的生活更轻松。
当然,这样做可能会产生其他不那么容易解决的问题,而这实际上取决于您的用例的细节......