Удаленный прокси-сервер 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

or

[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 не работает?


person S.Succi    schedule 05.10.2016    source источник
comment
Самым простым объяснением будет то, что базовый сервер не отправляет данные ни с одним из двух типов контента в вашей конфигурации. Сделайте сетевой дамп и подтвердите заголовок типа контента с удаленного сервера. Также похоже, что существует несовместимость с libxml2, вам может потребоваться обновить его.   -  person Unbeliever    schedule 07.10.2016


Ответы (2)


постараюсь ответить на ваши вопросы

1) Почему правило ProxyHTMLExtended On не анализирует внешние файлы .js, как описано в документации Apache?

Вы говорите, что ProxyHTMLExtended Директива:

должен включить синтаксический анализ внутри внешних файлов .css и .js, но это не работает.

Это кажется неверным, текущий документ говорит:

При значении Off HTML-ссылки перезаписываются в соответствии с директивами ProxyHTMLURLMap, но ссылки, отображаемые в Javascript и CSS, игнорируются.

При значении On все события сценариев (определяемые 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-адресам, это все еще работает, но, имхо, это не очень хороший перевод.
    Пример. <a href="http://remoteserver/about"> становится <a href="/mylocation//about">
    Предлагаю переписать так ProxyHTMLURLMap http://remoteserver /mylocation
person Luca Ricci    schedule 21.11.2016

У меня похожая проблема, у меня не работала замена мода.

Затем я где-то читал, что обычно 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. замена адреса конечной точки.

person 99Sono    schedule 28.05.2019