我正在开发一个 Web 应用程序,需要将来自旧版 Web 应用程序的页面嵌入到 iframe 中,该页面需要被识别为同一来源,以允许页面通过 javascript 处理 iframe 内容。
由于我在本地主机上进行开发。因此,我需要一种方法来代理旧版应用程序,使其也出现在本地主机上(或至少与本地托管的内容相同)。
事情稍微复杂了一点,由于我无法影响的防火墙之神的命令,我无法从我的开发网络访问公开可用的旧版应用程序(托管在同一栋大楼内),除非我通过 ssh 隧道连接到公共互联网上的某个随机出口点,并配置 chrome 通过生成的本地 socks 代理访问旧版应用程序的域。在生产环境中,整个问题不会存在,但现在我必须利用我已有的东西。
这听起来像是可以通过某个本地 nginx 配置解决的问题,它会将我本地运行的 Web 应用程序和代理的旧版应用程序显示为同一主机,尽管我不确定这应该叫什么。
还有其他可能更简单的解决方案我应该考虑吗?
答案1
我们将这个问题分成两个问题。
从开发环境访问旧版应用程序
由于您工作场所的防火墙管理员认为不可能从开发网络直接访问旧版应用程序,因此您选择使用 SSH 隧道来解决这个问题。
我不推荐这种方法,但既然你说我们应该使用你已有的东西,这就是我们必须做的。不过,我会调查你是否能够使用内部的IP 地址,而不是外部地址。表面上无法访问可能只是由于缺乏NAT 发夹结构支持。
但是,如果您无法与 Web 服务器建立直接 TCP 会话,则使用 SSH 技巧会有效。您不应使用“动态”隧道方法(即您的 SSH 客户端假装是 SOCKS 代理),而应使用静态(“本地”端口)隧道。例如 localhost:8081 -> [ssh 隧道] -> legacyapp.example.com:80。
让 Nginx 在与新应用相同的主机上为旧应用提供服务
您需要一个类似“子目录”的东西来保留旧版应用程序。您想要使用的是“反向代理”功能,根据 Nginx 网站上的记录。
如果旧版应用程序位于虚拟主机上,您还需要记住发送正确的 Host 标头。在您的配置中粘贴类似这样的内容应该接近您想要的:
location /legacyapp/ {
proxy_set_header Host "legacyapp.example.com";
proxy_pass http://localhost:8081;
}
其中 8081 是您的 SSH 隧道的端口号(或者如果您找到了访问旧版应用程序的 Web 服务器的另一种方式),而 legacyapp.example.com 是您的旧版应用程序的主机名。
只要您保持 SSH 隧道运行,此方法就会有效。对于生产来说有点不可靠,但我想对于开发设置来说应该可以。:-) 这就是为什么我鼓励您四处寻找,看看是否可以使用其内部 IP 而不是外部主机名从开发网络访问旧版应用程序。
希望这可以帮助。