来自代码的反向代理和 HTTP 请求
Reverse proxy and HTTP request from code
我正在尝试弄清楚什么是 "proper" 从 Web 应用程序代码以编程方式 发出 HTTP 请求的方法,而您不知道自己是或运行不在反向代理之后(例如 HTTPD)。
- Web 应用程序 运行 在 Web 服务器上的根“/”上下文中
- 具有上下文“/proxy”的代理 运行代理此 Web 服务器
从浏览器访问 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/
我正在尝试弄清楚什么是 "proper" 从 Web 应用程序代码以编程方式 发出 HTTP 请求的方法,而您不知道自己是或运行不在反向代理之后(例如 HTTPD)。
- Web 应用程序 运行 在 Web 服务器上的根“/”上下文中
- 具有上下文“/proxy”的代理 运行代理此 Web 服务器
从浏览器访问 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/