Sno*_*ire 13 mod-proxy apache-2.4
来自 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 指令相同。
有人可以解释一下它是如何工作的。一般来说,这个指令有什么作用?
Col*_*olt 11
如果实际处理请求的服务器重定向到该服务器上的不同 URL,则该ProxyPassReverse
指令会根据反向代理服务器重写 URL。例如,如 Apache文档中所述,如果:
http://reverseproxy.com/mirror/foo/bar
Run Code Online (Sandbox Code Playgroud)
被发送(反向代理)到
http://backend.example.com/bar
Run Code Online (Sandbox Code Playgroud)
用于处理,但在后端服务器确定正确的 URL 应该是quux
,即请求必须重定向到
http://backend.example.com/quux
Run Code Online (Sandbox Code Playgroud)
该 ProxyPassReverse
指令将 URL(在反向代理)重写为
http://reverseproxy.com/mirror/foo/quux
Run Code Online (Sandbox Code Playgroud)
在将 HTTP 重定向响应转发给客户端之前。这样,客户端只知道反向代理服务器,但仍然可以向正确的 URL 发出所需的请求,http://reverseproxy.com/mirror/foo/quux
然后将其反向代理到后端服务器并正常处理。简而言之,它只允许反向代理在 HTTP 重定向响应中返回正确的 URI 标头。
为了确保从后端生成的 Location: 标头被修改为指向反向代理,而不是返回到其自身,通常需要 ProxyPassReverse 指令:
代理密码“/”“http://www.example.com/”
ProxyPassReverse“/”“http://www.example.com/”
如果您有一个客户端和 2 个服务器,即 Proxy 和 Origin,其中 Origin 负责实际工作(生成响应),而 Proxy 只是将请求代理到 Origin,那么一个好的服务器架构是:
如果 Origin 不知道 Proxy,则Origin可能会通过 Proxy 返回给客户端一个 HTTP 重定向(HTTP 301 或 302),该重定向直接指向其自身 Origin。这是一个问题,因为浏览器将在下一轮中直接联系 Origin,从那时起对于每个请求都忽略 Proxy,这将违反第 2 点。
当 HTTP 重定向响应从代理返回到客户端时,代理可以/应该修改这些重定向,以便强制 Location 标头指向代理。这样,只要代理配置良好,在 Origin 上运行的独立应用程序(不知道代理)就可以生成任何重定向 URL,这样代理可以确保所有请求都遵守上述两点,并且 Origin 不会意外绕过此路径无需修改在 Origin 上运行的代码。
然而,当 Origin故意想要绕过 Proxy时,这无法解决问题,因为可以在 Apache 无法检测到的 HTML 代码中生成重定向。
归档时间: |
|
查看次数: |
20873 次 |
最近记录: |