我正在使用 Apache 2.4.27 作为反向代理,但在使用某些 ProxyHTMLURLMap 指令时遇到了问题。
我有一个代理服务器以及一个名为服务器1。
我的 HTML 中出现了一个 JavaScript 片段,还有一个单独的 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
马特。