我必须解决这个确切的问题。我能想出的唯一解决方案是使用反向代理。这像这样工作:
Browser (request without basic authentication) -> Reverse Proxy (request with added basic authentication) -> Destination server (requires basic authentication)
所以有一个反向代理在与目标服务器分开的地方运行。基本身份验证的详细信息存储在反向代理中。
假设中的 URLiframe
看起来像这样(假设反向代理在 port 上运行8088
):
<iframe src="http://proxy_id.proxy_host.com:8088/cgi-bin/some/path"></iframe>
然后反向代理将请求转换为如下所示:
http://destination_host.com:PORT/cgi-bin/some/path
Wheredestination_host
和PORT
基本身份验证的详细信息(作为请求标头发送到目标服务器,因此它们不再在 URL 中可见)取自基于proxy_id
原始 URL 中的反向代理配置。
反向代理将更改host
标头(从*.proxy_host.com
to destination_host.com
)但不会更改路径,因此代理对来自浏览器的任何请求都是透明的,包括下载 CSS 或 JavaScript 文件的任何子请求,甚至对发起的任何请求都是透明的来自 JavaScript。
此设置需要适当的 DNS 条目,以便proxy_id.proxy_host.com
解析到反向代理的 IP 并destination_host.com
解析到目标服务器的 IP。取决于要求proxy_host
实际上可以相同destination_host
(例如,如果代理在目标服务器上运行)。
这是基本的想法。在我的项目中,代理配置可以动态添加,因此我必须确保主域的所有子域都*.some_host.com
解析为相同的反向代理 IP。我为此使用Acrylic DNS,因为默认的 Windowshosts
文件不支持子域*
(包罗万象)。
根据您项目的要求,您可能能够找到可用于该目的的合适的反向代理。我的项目是用 Erlang 编写的,我找不到任何可以使用的代理,所以我实现了自己的。在 github 上查看:yoonka/charreada。它还没有任何文档,但代码相当简单。它可以潜在地用于以任何语言编写的任何项目,但目前的限制是使用 Erlang 调用添加配置(在我的项目中,它是从另一个 Erlang 应用程序提供的)。如果有任何需求,可以添加从静态文件中读取配置以及更好的文档:)