ProxyPassReverse 指令有什么用

ProxyPassReverse 指令有什么用

apache.org 的定义如下:

此指令允许 Apache httpd 调整 HTTP 重定向响应中的 Location、Content-Location 和 URI 标头中的 URL。当 Apache httpd 用作反向代理(或网关)时,这非常重要,以避免由于位于反向代理后面的后端服务器上的 HTTP 重定向而绕过反向代理。

仅会重写上面特别提到的 HTTP 响应标头。Apache httpd 不会重写其他响应标头,也不会默认重写 HTML 页面内的 URL 引用。这意味着,如果代理内容包含绝对 URL 引用,它们将绕过代理。要重写 HTML 内容以匹配代理,您必须加载并启用 mod_proxy_html。

path 是本地虚拟路径的名称;url 是远程服务器的部分 URL。这些参数的使用方式与 ProxyPass 指令相同。

有人能解释一下它是如何工作的吗?一般来说,这个指令有什么作用?

答案1

如果实际处理请求的服务器重定向到该服务器上的其他 URL,则该ProxyPassReverse指令将根据反向代理服务器重写 URL。例如,如 Apache文档, 如果:

 http://reverseproxy.com/mirror/foo/bar

发送(反向代理)至

 http://backend.example.com/bar

进行处理,但在后端服务器确定正确的 URL 应该是quux,即请求必须重定向到

 http://backend.example.com/quux

ProxyPassReverse指令将 URL(在反向代理处)重写为

 http://reverseproxy.com/mirror/foo/quux

在将 HTTP 重定向响应转发给客户端之前。这样,客户端只知道反向代理服务器,但仍然可以向正确的 URL 发出所需的请求,http://reverseproxy.com/mirror/foo/quux然后该 URL 将被反向代理到后端服务器并正常处理。简而言之,它只是允许反向代理在 HTTP 重定向响应上返回正确的 URI 标头。

答案2

来自Apache 2.4 反向代理指南

为了确保从后端生成的 Location:标头被修改为指向反向代理,而不是指向其自身,通常需要使用 ProxyPassReverse 指令:

ProxyPass "/" "http://www.example.com/"

ProxyPassReverse "/" "http://www.example.com/"

如果你有一个客户端和两个服务器,代理和源,其中源做实际工作(生成响应),代理只是将请求代理到源,一个好的服务器架构是

  1. Origin 不知道代理
  2. 每个请求都通过代理。

如果 Origin 不知道 Proxy可能Origin 通过代理向客户端返回 HTTP 重定向(HTTP 301 或 302),这指向直接地到自身,即 Origin。这是一个问题,因为浏览器将在下一轮中直接联系 Origin,从此以后每个请求都将不再使用 Proxy,这将违反第 2 点。

当 HTTP 重定向响应从代理返回到客户端时,代理可以/应该修改这些重定向,以便强制将 Location 标头指向代理。这样,在 Origin 上运行的独立应用程序(不知道代理)可以生成任何重定向 URL(只要代理配置正确),这样代理就可以确保所有请求都遵循上述两点,Origin 不会意外绕过此路径,并且无需对在 Origin 上运行的代码进行任何修改。

然而,这不能解决 Origin 的问题故意地想要绕过代理,因为重定向可以在 Apache 无法检测到的 HTML 代码中生成。

相关内容