ProxyPass指示

ProxyPass指示

我目前正在研究反向代理,但还没有想到具体的代理。

我正在尝试通过网络上的另一个具有身份验证的代理转发来自反向代理的请求。使用反向代理的主要原因是重写 URL,这样当用户单击它时,它将通过我的反向代理转发。但是,它还需要通过具有身份验证的实际代理。

所以基本上我想要实现的是,用户导航到一个站点,请求被反向代理捕获,然后反向代理通过另一个代理发出另一个请求(使用代理身份验证)。当反向代理收到响应时,它会根据响应中的内容重写 URL 并将其返回给用户。

我的问题是,这有可能吗?如果可以,我应该从哪里开始实现这个?

任何帮助都将不胜感激,谢谢!

编辑:我找到了一种使用 mod proxy 重写 url 的方法mod_replace。但仍然没有找到通过另一个代理转发网络请求的方法

答案1

这是来自 Apache 的文档

ProxyPass指示

描述:将远程服务器映射到本地服务器 URL 空间

句法ProxyPass [path] !|url [key=value [key=value ...]] [nocanon] [interpolate] [noquery]

语境:服务器配置,虚拟主机,目录

地位: 扩大

模块:mod_proxy

该指令允许将远程服务器映射到本地服务器的空间中;本地服务器不充当传统意义上的代理,而是看起来像是远程服务器的镜像。本地服务器通常被称为反向代理或者网关。 这小路是本地虚拟路径的名称;url 是远程服务器的部分 URL,不能包含查询字符串。

笔记:此指令不能在上下文中使用。

ProxyRequests通常应该设置该指令离开当使用 时 ProxyPass

假设本地服务器有http://example.com/;地址

代理通行证http://backend.example.com/

将导致 的本地请求http://example.com/mirror/foo/bar在内部转换为 的代理请求http://backend.example.com/bar

以下替代语法是可行的,但是当数量非常大时,可能会带来性能损失。以下语法的优点是它允许通过 Balancer Manager 界面进行动态控制:

ProxyPass /mirror/foo/ http://backend.example.com/

如果第一个参数以尾随 / 结尾,则第二个参数也应以尾随 / 结尾,反之亦然。否则,对后端的请求可能会遗漏一些必要的斜杠,并且无法提供预期的结果。

! 指令在你不想反向代理子目录的情况下很有用,例如

<Location /mirror/foo/>
ProxyPass http://backend.example.com/
</Location>

<Location /mirror/foo/i>
ProxyPass !
</Location>

ProxyPass /mirror/foo/i ! ProxyPass /mirror/foo http://backend.example.com

将所有请求代理/mirror/foobackend.example.com 除了向 提出 的 请求/mirror/foo/i

订购 ProxyPass 指令

配置的ProxyPass规则ProxyPassMatch将按照配置顺序进行检查。匹配的第一个规则获胜。因此,通常您应该ProxyPass首先从最长的 URL 开始对冲突的规则进行排序。否则,较长 URL 的后续规则将被任何使用 URL 前导子字符串的较早规则隐藏。请注意,这与工作者共享有某种关系。相反, ProxyPass一个块中只能放置一个指令Location,并且最具体的位置将优先。出于同样的原因,必须排除一般ProxyPass指令。

在 Apache HTTP Server 2.1 及更高版本中,mod_proxy 支持与后端服务器的池连接。按需创建的连接可以保留在池中以供将来使用。池大小的限制和其他设置可以使用key=value参数在 ProxyPass 指令上进行编码,如下表所述。

默认情况下,mod_proxy 将允许并保留该 Web 服务器子进程可以同时使用的最大连接数。使用参数max可减少默认值。使用参数ttl可设置可选的生存时间;至少 100 秒未使用的连接ttl将被关闭。ttl可用于避免使用由于后端服务器的保持活动超时而可能关闭的连接。

连接池由每个 Web 服务器子进程维护,并且max其他设置并不在所有子进程之间协调,除非配置或 MPM 设计只允许一个子进程。

例子

ProxyPass /example http://backend.example.com max=20 ttl=120 retry=300

答案2

考虑@Tim Dunkley 的答案,并使用ProxyRemote指令进行扩展。 结合ProxyPassProxyRemote应该会导致所要求的结果,并且将非常灵活。

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxyremote

http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxyremote

相关内容