我有一个正在运行的 Web 应用程序http://example.com/
,并且想在 . 上的单独服务器上“挂载”另一个应用程序http://example.com/en
。上游服务器proxy_pass
似乎可以工作,但有一个问题:
upstream luscious {
server lixxxx.members.linode.com:9001;
}
server {
root /var/www/example.com/current/public/;
server_name example.com;
location /en {
proxy_pass http://luscious;
}
}
打开时example.com/en
,我的上游应用程序返回404 not found /en
。这是有道理的,因为上游没有 path /en
。
是proxy_path
正确的解决方案吗?我是否应该重写“上游”以便它/en
作为根路径来监听?或者是否有一个指令允许我重写传递到上游的路径?
在不使用任何正则表达式的情况下,这可能是做你想做的最有效的方法:
我想解决一个越来越受欢迎的基于正则表达式的新答案。
乍一看,该解决方案可能看起来更可爱,但由于多种原因,它是错误的。
上面的正则表达式将匹配 的请求 uri
/enjoy
,将其重定向到/joy
上游。这真的是故意的吗?一个请求
/en
不会导致任何重定向,直接/
从上游提供一个(几乎就像一个请求/en/
代替了,但不完全是)。如果您在上游根页面中使用相对 URI(否则,为什么/en/
在上游 URI 中没有前缀?),例如src="style.css"
(可能引用特定于语言的url("menu.png")
,例如),那么浏览器将请求作为/style.css
而不是/en/style.css
. (或者即使你在任何地方都使用绝对 URI,如果有人相对地引用了一个不起眼的半可选资源怎么办?)糟糕,这个网站突然可能无法工作,但只是有时或在边缘情况下。根据我之前对 OP 自己的答案已经提到的另一个问题的建议,使用正则表达式可以防止
proxy_redirect
指令具有默认值default
,而是将其off
改为。这意味着如果上游Location: http://127.0.0.1:8080/en/dir/
在发出请求时回复/en/dir
,那么这就是客户端将看到的内容,这显然无法正常工作。(这对于一开始就提示使用正则表达式的请求来说尤其具有讽刺意味/en
,但是这个特定的实现反而会遇到上面已经提到的另一个问题。)另外,如果您已经在使用upstream
指令,那么如果你只是尝试使用自定义的,它可能会变得更加丑陋,特别是如果你可能有多个上游服务器 - 你如何proxy_redirect
为每一个单独设置一个?您也可以在 中使用正则表达式proxy_redirect
,甚至可以匹配任何主机,但是如果您决定将来提供跨域重定向怎么办?为了尝试使用单个基于正则表达式的位置来解决上述一些问题,我们可以执行以下操作(请注意,
proxy_pass
我们还必须从基于 - 的指令中删除对服务器的引用upstream
,以使其proxy_redirect
更直接):因此,如果您问我,与两个兄弟顶级位置的原始解决方案相比,通过使用正则表达式路线将自己挖进兔子洞仍然是一个更好的主意。
所以,我在 stackoverflow 上找到了答案:
基本上:将正则表达式传递到位置并将反向引用传递给 proxy_pass url。
记账到Nginx 文档
要将请求传递给 HTTP 代理服务器,需要在位置内指定 proxy_pass 指令。例如:
此示例配置导致将在此位置处理的所有请求传递到指定地址的代理服务器。此地址可以指定为域名或 IP 地址。该地址还可能包括一个端口:
请注意,在上面的第一个示例中,代理服务器的地址后跟一个 URI,/link/。如果 URI 与地址一起指定,它将替换请求 URI 中与 location 参数匹配的部分。例如,这里带有 /some/path/page.html URI 的请求将被代理到http://www.example.com/link/page.html。如果指定的地址没有 URI,或者无法确定要替换的 URI 部分,则传递完整的请求 URI(可能已修改)。
我对上面接受的解决方案进行了尝试,但发现它导致所有 CSS 和 JS 资产的重定向不可靠。最后,我从 LinuxServer SWAG Nginx 配置的完成方式中找到了灵感。你可以在这里找到它们。看看
pihole.subfolder.conf.sample
。因此,我的解决方案如下所示: