![mod_rewrite 使用 mod_proxy 根据特定查询字符串提供静态文件](https://linux22.com/image/690668/mod_rewrite%20%E4%BD%BF%E7%94%A8%20mod_proxy%20%E6%A0%B9%E6%8D%AE%E7%89%B9%E5%AE%9A%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8F%90%E4%BE%9B%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6.png)
我想mod_proxy
在托管 SOAP Web 服务的 IIS 前面有一个反向代理(带有 apache httpd)。
我面临的问题是 SOAP 客户端通过WSDL
从端点下载来向 Web 服务器询问有关 Web 服务的详细信息。此 WSDL 由 Web 服务生成,其中包含客户端应使用的 Web 服务的 URL。问题是,当 Web 服务位于代理后面时,生成的 URL 包含错误的私有地址。
IIS Web 服务位于
http://internal.host.com/Dirname/Service.asmx
,可以使用GET
或调用POST
。
使用 GET 检索 WSDL,查询WSDL
字符串如下:
http://internal.host.com/Dirname/Service.asmx?WSDL
反向代理将 Web 服务呈现为:
https://proxy.host.com/VirtualDir/Service.asmx
我的问题是动态生成的 WSDL 的内容包含内部 URL(代理连接到的 URL)。
我想避免黑客攻击/重新编译 Web 服务本身,因此当我考虑替代解决方案时,我想到这一点;
我是否可以httpd
在代理服务器上以某种方式拦截对?WSDL 文档的调用并提供静态内容,同时仍将其他查询(包括 GET 参数)转发到内部 IIS 服务器?
相关的 httpd 配置目前如下所示:
ProxyPass "/VirtualDir/" "http://internal.host.com/Dirname/"
我在想也许 RewriteCond 和 RewriteRule 可以以某种巧妙的方式用来只捕获对的请求/.../Service.asmx?WSDL
并提供静态本地文档,然后将“其余部分”转发到 IIS,但我真的不知道如何在不破坏其他任何东西的情况下正确地做到这一点。
反向代理也用于其他虚拟“目录”下的其他服务。
答案1
我暂时解决了这个问题,方法是创建一个静态 WSDL 规范,其中包含服务方法的正确(代理)地址,并告诉客户端使用该地址。
它似乎运行良好,但是每次 WebService 接口发生变化时都必须进行更新。
我已经在以下地址的代理 apache http 上设置了一个静态文件:
https://proxy.host.com/other_static_dir/Service.wsdl
它包含正确的 WSDL 规范以及要使用的公共 URI。我从 IIS 下载了它wget
,然后用文本编辑器修复了它。