我的 LAN 上有一个带有 URL 的 Web 服务器https://10.0.0.22
,我正尝试通过 nginx 反向代理使用类似这样的 URL 从 Internet 访问它https://domain.com/my/web/app
。
我遇到的困难是本地服务器向 发送 302 重定向/login.php
,然后 nginx 将其传回外部客户端的浏览器,变成https://domain.com/login.php
而不是https://domain.com/my/web/app/login.php
。这会导致 404 错误,因为 上没有任何内容https://domain.com/login.php
。
我尝试过许多不同的选择,但收效甚微,包括各种各样的rewrite
、proxy_redirect
和proxy_buffering
指令,但这是我能得到的最接近的结果:
location ^~ /my/web/app/
{
proxy_buffering off;
rewrite /my/web/app/(.*) /$1 break;
proxy_pass https://10.0.0.22/;
}
有没有办法配置 nginx,以便内部 Web 服务器的 302 重定向到 在 /login.php
外部表现为/my/web/app/login.php
?
答案1
在不断调查和测试不同的指令组合和顺序后,添加proxy_redirect
该proxy_pass
指令似乎修复了 URI 翻译问题:
proxy_redirect https://10.0.0.22/ https://domain.com/my/web/app/;
经过一些修改后,似乎设置proxy_redirect
为default
隐式地做了同样的事情:
proxy_redirect default;
完整的位置块如下所示:
location ^~ /my/web/app/
{
proxy_buffering off;
rewrite /my/web/app/(.*) /$1 break;
proxy_pass https://10.0.0.22/;
#proxy_redirect https://10.0.0.22/ https://domain.com/my/web/app/;
proxy_redirect default;
}
但是,图像仍然有问题,因为它们指向/images
本地服务器。我不确定如何让 nginx 翻译这些图像(因为它们嵌入在 HTML 主体中),但为了暂时解决这个问题,我能够添加一个专用location
块/images
前的位置块/my/web/app
,如下所示:
location ^~ /images/
{
proxy_pass https://10.0.0.22/images/;
proxy_redirect default;
}