反向代理模式 Apache 拦截或捕获来自后端服务器的 302 响应并在内部重定向而不将 302 响应发送回客户端

Posted

技术标签:

【中文标题】反向代理模式 Apache 拦截或捕获来自后端服务器的 302 响应并在内部重定向而不将 302 响应发送回客户端【英文标题】:Reverse proxy mode Apache intercept or trap 302 responses from backend server and redirect internally without sending 302 response back to client 【发布时间】:2010-11-11 18:31:06 【问题描述】:

有谁知道如何告诉 Apache 在反向代理模式下拦截或捕获来自后端服务器的 302(或 30x)响应并在内部重定向而不将 30x 响应发送回客户端? 最终,响应重定向到的后端服务器将无法从外部访问(或未在 Apache conf 中列出)。


我的情况: 我有 web_server_A 和 web_server_B 监听端口 6666 和 7777。这些端口不能从外部访问,但可以从内部访问。 我最终可以改变 web_server_A 的行为,但不能改变 web_server_B 的行为。 Apache 正在侦听可从外部访问的端口 80/443,并充当反向代理,将发送到 web_server_A,B.example.com 的请求发送到 web_server_A,B

客户端向 Apache 请求 web_server_A.example.com/foo。 Apache 将请求代理到 web_server_A,它会做一些东西,然后将指向 web_server_B.example.com/bar/secret_token 的 HTTP/302 响应发送回 Apache。 Apache 将 302 响应发送回客户端,然后客户端向 Apache 发送对 web_server_B.example.com/bar/secret_token 的 HTTP 请求。 Apache 将请求代理到 web_server_B,它会回复一些东西(通常它会发回一些大文件)。


我的问题: 我不希望客户端知道 url web_server_B.example.com/bar/secret_token,最终我不希望 web_server_B 可以从外部访问。

web_server_A 可以向 web_server_B 发出请求,然后从 web_server_B 发回答案而不发出 302 回复。但是,来自 web_server_B 的回答可能需要一些时间,可能会很大,并且 web_server_A 不应该在任何请求上花费太多时间(它没有处理大文件的能力)。


所以我想到了一个“302 陷阱”功能,如果存在的话会很好,但到目前为止,还没有在网络上提供任何关于如何做到这一点的资金。有什么想法吗?

【问题讨论】:

服务器配置问题可能会在 serverfault.com 上得到更好的答案 【参考方案1】:

使用 ProxyPassReverse 指令,web_server_A 将修改 web_server_B 发送的 Location 头,因此客户端不会知道他。

要捕获来自上游服务器的重定向,您还可以编辑 Location 标头。例如“标题未设置位置”将显示 apache 默认 30X 错误页面

【讨论】:

【参考方案2】:

作为反向代理,Apache 将无法“阻止回复”。它不是审查员。 不过,你可以自己写这样的东西。

【讨论】:

以上是关于反向代理模式 Apache 拦截或捕获来自后端服务器的 302 响应并在内部重定向而不将 302 响应发送回客户端的主要内容,如果未能解决你的问题,请参考以下文章

NGINX 反向代理响应

具有基本身份验证的 Apache 反向代理

apache配置反向代理+websocket

nginx学习之反向代理

配置nginx反向代理

配置nginx反向代理