Я использую Apache 2.4.27 в качестве обратного прокси, и у меня возникают проблемы с некоторыми из моих директив ProxyHTMLURLMap.
у меня есть прокси-сервер и внутренний сервер, называемый server1.
У меня есть фрагмент 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>
Фрагмент JavaScript, который появляется как в файлах HTML, так и в JS:
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",
Почему директива URLMap не затрагивает JS-файл? Любые идеи очень ценятся!
FYI, файл httpd_access_log показывает 404 ошибки в строках 2 и 5 ниже:
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
Мэтт.
Я нашел 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
директивы, то снижение производительности будет значительным!
Мэтт.
Один упал, один остался. Я обнаружил исправление одного из своих вопросов, повторяющиеся замены ... Короче говоря, это плохо:
ProxyHTMLEnable On
SetOutputFilter INFLATE;proxy-html;DEFLATE
Обе директивы вставляют поставщика прокси-html-фильтра в цепочку выходного фильтра. Видимо, в свое время ProxyHTMLEnable не вставлял proxy-html, поэтому понадобилась вторая строка.
Больше никаких дубликатов, как только я исправил вторую строку:
ProxyHTMLEnable On
SetOutputFilter INFLATE;DEFLATE
Для полноты, эквивалент будет:
ProxyHTMLEnable Off
SetOutputFilter INFLATE;proxy-html;DEFLATE
Мэтт.