IHS代理遇到404的问题
因为工作的原因最近使用IBM Http server (IHS)做代理服务器。IHS和Apache相似度很高,有不明白的地方可以查看Apache的相关文档做参考资料。(这里不得不吐槽一下IHS相关资料真的好少!)
我们的程序访问流程是如下图。我们有一台提供服务的服务器A,IHS作为A的代理服务器接受所有客户端的访问,然后再将访问转给服务器A。服务器A返回信息,IHS将对于的信息返回给客户端。IHS的作用就是左手交右手的操作而已。
但配置好以下代理的设置后,使用Client发出请求得到404的错误。
SSLProxyEngine on
ProxyPreserveHost on
ProxyPass /xxx/xxx https://Server A/xxxx/xxxx
ProxyPassReverse /xxx/xxx https://Server A/xxxx/xxxx
可以确认Service A运行正常,因为使用Postman是可以直接访问Server A提供的API服务获取相关的信息。经过多次实验和翻查资料后,最终定位到ProxyPreserveHost这个设置。应该将ProxyPreserveHost设置为off!!!
以下是Apache官网配置手册的原话(建议使用英文去理解,中文翻译我看得一头雾水。)
当IHS作为Service A的代理,ProxyPreserveHost设置为“on”,IHS会将client请求报头(Request header)中Host的值直接放到IHS请求Server A请求报头的Host中。如下图所示:
由于request header中的Host是用来指示使用服务器A那个服务的,服务器A中根本没有IHS的服务,所以只能返回404了。
如果ProxyPreserveHost设置为“off”,IHS会使用ProxyPass设置中的hostname值放到请求Server A请求报文头的Host中。如下图所示:
Host设置了正确的Server A地址,Server A才会正确返回数据。
参考Apache官网手册地址:http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxypreservehost