我使用 Apache 2.4.27 作為反向代理,但我的一些 ProxyHTMLURLMap 指令遇到了問題。
我有一個代理伺服器和一個後端伺服器,稱為伺服器1。
我有一個 JavaScript 片段出現在 HTML 以及一個單獨的 JS 檔案中。 ProxyHTMLURLMap錯誤地修改了HTML文件,並且沒有修改JS文件。
如何定義此 URLMap 來影響這兩個地方?
這是我的設定片段:
LogLevel warn proxy_html:trace3
<Location "/server1/">
ProxyPass https://server1:5443/ ping=2
ProxyPassReverse https://server1/
ProxyHTMLEnable On
ProxyHTMLExtended On
SetOutputFilter INFLATE;proxy-html;DEFLATE
ProxyHTMLURLMap /rpc/ /server1/rpc/
</Location>
HTML 和 JS 檔案中出現的 JavaScript 片段是:
abc.get({
url: "/rpc/getdefaultcfg.asp",
onrcv: function(arg) {
if (arg.STATUS == 0) {
default_Lang = WEBVAR_JSONVAR_GETDEFAULTLANG.WEBVAR_STRUCTNAME_GETDEFAULTLANG;
}
onload = loadInit();
}
});
HTML檔案被ProxyServer修改兩次將匹配行更新為:
url: "/server1/server1/rpc/getdefaultcfg.asp",
請注意重複的“server1”。為什麼會重複?
該 HTML 文件包含 JS 文件,如下所示:
<script language="Javascript" src="index.js"></script>
但是,index.js 不會被代理伺服器修改。它保持不變,如下所示:
url: "/rpc/getdefaultcfg.asp",
為什麼 JS 檔案不受 URLMap 指令影響?任何想法都非常感謝!
僅供參考,httpd_access_log 檔案在下面的第 2 行和第 5 行顯示了 404 錯誤:
1. 192.1.0.76 - "GET /server1/index.html HTTP/1.1" 200 946
2. 192.1.0.76 - "GET /rpc/getdefaultcfg.asp HTTP/1.1" 404 223
3. 192.1.0.76 - "GET /server1/page/disable_javascript.html HTTP/1.1" 200 212
4. 192.1.0.76 - "GET /server1/page/blank.html HTTP/1.1" 200 -
5. 192.1.0.76 - "GET /server1/server1/rpc/getdefaultcfg.asp HTTP/1.1" 404 126
最後,proxy_html 追蹤的輸出:
[proxy_html:trace3] mod_proxy_html.c(265): [client 192.1.0.76:51880] C: matched /rpc/, substituting /server1/rpc/
[proxy_html:trace3] mod_proxy_html.c(265): [client 192.1.0.76:51880] C: matched /rpc/, substituting /server1/rpc/
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51880] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/header.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51880] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/header.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51892] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/login.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51892] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/login.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51880] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/header.html
[proxy_html:trace1] mod_proxy_html.c(827): [client 192.1.0.76:51880] Non-HTML content; not inserting proxy-html filter, referer: https://proxy-server/server1/page/header.html
馬特。
答案1
我發現該ProxyHTMLURLMap
指令缺乏替換所需的靈活性。相反,我使用了該Substitute
指令。
為了確保替換發生在我關心的每種文件類型中,我首先使用了以下指令:
AddOutputFilterByType SUBSTITUTE text/javascript text/html text/css
然後我使用了很多Substitute
指令。其中之一的例子是:
# Fixup min.js urlPath() references
Substitute "s#(urlPath\(\))#$1 + \"$npar/\" #q"
需要注意的一件事是,每個指令都會掃描整個文件Substitute
,因此請嘗試將盡可能多的替換內容塞入一個指令中。例如,我使用正規表示式來涵蓋幾種情況:
Substitute "s#(\"|\')/(api|app|images|source|style)#$1/$npar/$2#q"
如果您有一個大檔案和很多單獨的Substitute
指令,那麼效能損失會很大!
馬特。
答案2
一下,一去。我發現了我的一個問題的修復方法,重複替換......簡而言之,這很糟糕:
ProxyHTMLEnable On
SetOutputFilter INFLATE;proxy-html;DEFLATE
這兩個指令都將 proxy-html 過濾器提供者插入到輸出過濾器鏈中。顯然,ProxyHTMLEnable 有一次沒有插入 proxy-html,因此需要第二行。
一旦我將第二行更正為:
ProxyHTMLEnable On
SetOutputFilter INFLATE;DEFLATE
為了完整起見,等效項是:
ProxyHTMLEnable Off
SetOutputFilter INFLATE;proxy-html;DEFLATE
馬特。