我目前有一个供应商 Web 应用程序,它将完全限定域名放在响应主体(HTML、JavaScript、CSS)中。例如,对“realserver.mycompany.com”发出的请求将包含 JavaScript,其变量设置为https://realserver.mycompany.com/path/to/something。我已将 Apache 服务器设置为反向代理。代理指令对响应主体没有任何影响,因此我已包含 mod_substitute 以查找“realserver.mycompany.com”的实例并将其替换为“proxyserver.mycompany.com”。虽然这有效,但它会导致浏览器客户端创建包含“proxyserver.mycompany.com”作为数据一部分的请求,而后端希望看到“realserver.mycompany.com”。因此,我需要能够对请求内容执行我在响应主体上执行的反向替换。但是,mod_substitute 的文档明确指出它对响应主体进行操作。
这是我当前正在使用的配置:
<Location "/">
RequestHeader unset Accept-Encoding
RequestHeader unset Accept
RequestHeader set Accept-Encoding "identity; q=1.0,*;q=0"
ProxyPass https://realserver.mycompany.com/
ProxyPassReverse https://realserver.mycompany.com/
Substitute "s|realserver.mycompany.com|proxyserver.mycompany.com|in"
FilterDeclare webtestOut
FilterProvider webtestOut SUBSTITUTE "%{Content_Type} = ~m|^application/.*|"
FilterProvider webtestOut SUBSTITUTE "%{Content_Type} =~ m|^text/.*|"
</Location>
我不知道如何在将请求传递到后端服务器之前将“proxyserver.mycompany.com”的实例更改为“realserver.mycompany.com”。我没有被 Apache 束缚。如果有办法使用 NGINX 实现这一点,我很乐意改变。
答案1
如果需要重写内容,那么请查看mod_proxy_html
模块。
如果您可以控制后端内容,则最好在内容中使用相对链接。如果需要域,则使用请求中的域可以消除重写的需要。只需将请求传回而不修改 Host 标头,并将该域用于包含该域的链接。