APACHE 2.4 Удаленный прокси mod_substitute и ProxyHTMLExtended не работают
Я создал обратный прокси-сервер с Apache 2.4 на сервере Cento 7. Он работает со стандартными страницами HTML, но мне нужно заменить некоторые URL-адреса, хранящиеся в файлах.js. Директива:
ProxyHTMLExtended On
следует включить разбор внутри внешних файлов.css и.js, но он не работает. В файле журнала я вижу:
[proxy_html:trace1] [pid 3263] mod_proxy_html.c(823): [client xxx] Non-HTML content; not inserting proxy-html filter
Я попытался использовать mod_substitute, это интересная часть моего httpd.conf:
ProxyPass /mylocation/ http://remoteserver/
<Location /mylocation/>
ProxyHTMLEnable On
ProxyHTMLExtended On
LogLevel debug proxy_html:trace3 substitute_module:debug
RequestHeader unset Accept-Encoding
AddOutputFilterByType SUBSTITUTE text/javascript text/html
Substitute "s|/css/|/mylocation/css/|ni"
Substitute "s|/js/|/mylocation/js/|ni"
Substitute "s|/custom_logo/|/mylocation/custom_logo/|ni"
Substitute "s|/html/|/mylocation/html/|ni"
Substitute "s|/current_config/|/mylocation/current_config/|ni"
Substitute "s|/web_lang/|/mylocation/web_lang/|ni"
Substitute "s|/custom_lang/|/mylocation/custom_lang/|ni"
ProxyPassReverse /
ProxyHTMLURLMap //remoteserver /mylocation/
ProxyHTMLURLMap http://remoteserver /mylocation/
ProxyHTMLURLMap /mylocation /mylocation
ProxyHTMLURLMap ^\/(.*) /mylocation/$1 R
</Location>
Но в файле журнала нет никаких следов mod_substitute. Кажется, mod_substitute никогда не вызывается.
Правила proxyHTMLURLMap работают нормально, но только на обычных html-файлах.
В зависимости от файла.js, который я запрашиваю на сервере, я могу видеть в файле журнала:
[xml2enc:debug] [pid 3259] mod_xml2enc.c(254): [client xxx] AH01434: Charset ISO-8859-1 not supported by libxml2; trying apr_xlate
или же
[proxy_html:trace1] [pid 3263] mod_proxy_html.c(823): [client xxx] Non-HTML content; not inserting proxy-html filter
затем процесс останавливается, я получаю файл, но на нем ничего не заменено.
1) Почему правило "ProxyHTMLExtended On" не анализирует внешние файлы.js, как описано в документации Apache?
2) Почему mod_substitute не работает?
3 ответа
Я постараюсь ответить на ваши вопросы
1) Почему правило "ProxyHTMLExtended On" не анализирует внешние файлы.js, как описано в документации Apache?
Вы говорите, что ProxyHTMLExtended
Директива:
следует включить разбор внутри внешних файлов.css и.js, но он не работает.
Это кажется неправильным, текущий документ говорит:
Если установлено значение "Выкл.", Ссылки HTML переписываются в соответствии с директивами ProxyHTMLURLMap, но ссылки, появляющиеся в Javascript и CSS, игнорируются.
Если установлено значение "Вкл", все события сценариев (как определено ProxyHTMLEvents) и встроенные сценарии или таблицы стилей также обрабатываются правилами ProxyHTMLURLMap в соответствии с флагами, установленными для каждого правила. Поскольку это требует большего разбора, производительность будет наилучшей, если вы включите ее только в случае крайней необходимости.
Это означает, что встроенные скрипты, те, что в <script></script>
проверены. Это не упоминает файлы.js.
2) Почему mod_substitute не работает?
Об этом я не знаю наверняка, почему он не работает, но при условии, что mod_substitute включен, так как apache запущен без ошибок, единственное, что я могу догадаться, это то, что apache отправляет application/javascript
как Mime-Type вместо text/javascript
что ты написал
Некоторые бонусы:
- Я бы не использовал
ProxyHTMLURLMap ^\/(.*) /mylocation/$1 R
сProxyHTMLExtended On
потому что будет переводить каждый/
в ваших сценариях, если у вас есть<script> var a = 12/2; </script>
будет переведен на<script> var a = 12/mylocation/2; </script>
, Я хотел бы рассмотреть возможность использованияProxyHTMLURLMap / /mylocation/ c
(c
флаг означает: "Пропускать встроенные сценарии и разделы стиля через нетронутые".) - Я не думаю, что тебе нужно
ProxyHTMLURLMap /mylocation /mylocation
ProxyHTMLURLMap http://remoteserver /mylocation/
добавит дополнительный/
к вашим URL, это все еще работает, но, imho, это не очень хороший перевод.
Ex.<a href="http://remoteserver/about">
становится<a href="/mylocation//about">
Я предлагаю переписать это такProxyHTMLURLMap http://remoteserver /mylocation
У меня похожая проблема, когда замена мне не работала.
Затем я где-то читал, что обычно mod_subsittue по умолчанию работает только в том случае, если HTTP-ответ, который вы получаете с сервера, имеет тип mime txt / html.
Это был не мой сценарий. Мой сценарий состоял в том, что я хочу переписать содержимое XML, а именно веб-сервис JEE, который был прокси прокси-сервером apache httpd.
Для того, чтобы сделать замену мода изменяющим содержимое ответа, нужно было сделать:
<Location /mockOutgoingWebServicePortBinding>
# core authentication and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
Authname "Password Required"
# core authorization configuration
AuthUserFile C:\Apache24\conf\htpasswd
Require valid-user
# mod_filter to be able to subsitute text xml
AddOutputFilterByType SUBSTITUTE text/xml text/html
Substitute "s|http://someHostName:8088/|http://localhost:80/|i"
</Location>
Волшебным шагом было включение mod_filter и добавление директивы: AddOutputFilterByType .
Когда это было добавлено, подстановка изменила тело xml. замена адреса конечной точки.
Об этом:
Но в лог-файле нет следов mod_substitute
Мне удалось получить трассировку mod_substitute в error.log, используя:
LogLevel alert substitute:trace8