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
Другие вопросы по тегам