来自代码的反向代理和 HTTP 请求

Reverse proxy and HTTP request from code

我正在尝试弄清楚什么是 "proper" 从 Web 应用程序代码以编程方式 发出 HTTP 请求的方法,而您不知道自己是或运行不在反向代理之后(例如 HTTPD)。

从浏览器访问 index.html 应该通过 /proxy/index.html 请求。 但是如果 Web 应用程序中有一些代码(例如 myscript.js)以编程方式发送 HTTP 请求(例如 xhr.open("???/resource").

问题来了,因为 代码 将此 HTTP 请求发送到 /resource 而不是发送到 /proxy/resource。

换句话说,Web 应用程序代码(浏览器中的 运行s)不知道是否有代理。请记住,应用程序可以 运行 在代理后面,但可能根本没有任何代理。我想到了 3 个解决方案:

1) Web 应用程序通过从当前 window.location.path 解析它来自动解析上下文(例如 /proxy)并根据它发送 xhr

2) 增强 Web 应用程序以要求用户对代理进行一些额外的配置,如果已设置,它会附加上下文

3) 以某种方式配置代理以将非代理类的 URL 重新发送到 Web 服务器 1:1(例如 /proxy -> webserver/, / -> webserver/)

哪个是"the proper"一个或者还有其他选择吗?

后端网络应用程序不应该知道它们上面或前面是否有代理。理想情况下,他们应该生活在自己的上下文路径中,例如。 /application/ 如果他们需要发送重定向,则无需在其中使用主机名或 url 方案,只需 URL-Path /application/*

那么理想情况下,您可以根据您的第 3 种情况执行简单的反向代理指令:

ProxyPass /XXX/ http://backend/application/
ProxyPassReverse /XXX/ http://backend/application/