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
为了确保从后端生成的 Location:标头被修改为指向反向代理,而不是指向其自身,通常需要使用 ProxyPassReverse 指令:
ProxyPass "/" "http://www.example.com/"
ProxyPassReverse "/" "http://www.example.com/"
如果你有一个客户端和两个服务器,代理和源,其中源做实际工作(生成响应),代理只是将请求代理到源,一个好的服务器架构是
- Origin 不知道代理
- 和每个请求都通过代理。
如果 Origin 不知道 Proxy可能Origin 通过代理向客户端返回 HTTP 重定向(HTTP 301 或 302),这指向直接地到自身,即 Origin。这是一个问题,因为浏览器将在下一轮中直接联系 Origin,从此以后每个请求都将不再使用 Proxy,这将违反第 2 点。
当 HTTP 重定向响应从代理返回到客户端时,代理可以/应该修改这些重定向,以便强制将 Location 标头指向代理。这样,在 Origin 上运行的独立应用程序(不知道代理)可以生成任何重定向 URL(只要代理配置正确),这样代理就可以确保所有请求都遵循上述两点,Origin 不会意外绕过此路径,并且无需对在 Origin 上运行的代码进行任何修改。
然而,这不能解决 Origin 的问题故意地想要绕过代理,因为重定向可以在 Apache 无法检测到的 HTML 代码中生成。