mod_rewrite 根據帶有 mod_proxy 的特定查詢字元串提供靜態文件
我想
mod_proxy
在託管 SOAP Web 服務的 IIS 前面有一個反向代理(apache httpd with )。我面臨的問題是 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(代理連接到的)。
我想避免破解/重新編譯 Web 服務本身,所以當我考慮替代解決方案時,我想知道這一點;
我可以
httpd
在代理伺服器上以某種方式攔截對 ?WSDL 文件的呼叫並改為提供靜態內容,並且仍然將其他查詢(包括 GET 參數)轉發到內部 IIS 伺服器嗎?相關的 httpd 配置目前如下所示:
ProxyPass "/VirtualDir/" "http://internal.host.com/Dirname/"
而且我在想也許 RewriteCond 和 RewriteRule 可以以某種聰明的方式使用來僅擷取對 的請求
/.../Service.asmx?WSDL
並提供靜態本地文件,然後將“其餘部分”轉發給 IIS,但我真的不知道如何在不破壞其他任何東西的情況下正確地做到這一點。反向代理也用於其他服務,在其他虛擬“目錄”下。
我暫時解決了這個問題,方法是創建一個靜態 WSDL 規範,其中包含服務方法的正確(代理)地址,並告訴客戶端改用那個地址。
它似乎工作得很好,但每次 WebService 介面更改時都必須更新它。
我在這個地址的代理 apache http 上設置了一個靜態文件:
https://proxy.host.com/other_static_dir/Service.wsdl
它包含正確的 WSDL 規範以及要使用的公共 URI。我從 IIS 下載了它,
wget
然後用文本編輯器修復了它。