2

我在 cento 的 7 服务器上使用 Apache 2.4 构建了一个反向代理。它适用于标准 html 页面,但我也需要替换一些存储在 .js 文件中的 url。指令:

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 不起作用?

4

3 回答 3

2

我会尽力回答你的问题

1)为什么“ProxyHTMLExtended On”规则不解析外部 .js 文件,如 Apache 文档中所述?

你说那个ProxyHTMLExtended指令:

应该在外部 .css 和 .js 文件中启用解析,但它不起作用。

这似乎是不正确的,当前的文档说:

设置为 Off,根据 ProxyHTMLURLMap 指令重写 HTML 链接,但忽略 Javascript 和 CSS 中出现的链接。

设置为 On,所有脚本事件(由 ProxyHTMLEvents 确定)和嵌入的脚本或样式表也由 ProxyHTMLURLMap 规则根据为每个规则设置的标志进行处理。由于这需要更多解析,因此如果仅在绝对必要时启用它,性能将是最佳的。

这意味着嵌入的脚本,其中的那些<script></script>被检查。它没有提到 .js 文件。

2) 为什么 mod_substitute 不起作用?

关于这一点,我不确定为什么它不起作用,但假设 mod_substitute 已启用,因为 apache 启动时没有错误,我唯一能猜到的是 apache 是application/javascript作为 Mime-Type 发送的,而不是text/javascript你写的

一些奖励建议:

  • 我不会使用ProxyHTMLURLMap ^\/(.*) /mylocation/$1 RwithProxyHTMLExtended On因为会翻译/你的脚本中的每一个,如果你有的话<script> var a = 12/2; </script>会被翻译成<script> var a = 12/mylocation/2; </script>. 我会考虑使用ProxyHTMLURLMap / /mylocation/ cc标志的意思是:“通过原样传递嵌入的脚本和样式部分。”)
  • 我真的不认为你需要ProxyHTMLURLMap /mylocation /mylocation
  • ProxyHTMLURLMap http://remoteserver /mylocation/将为您的网址添加额外/的内容,它仍然有效,但恕我直言,这不是一个好的翻译。
    前任。<a href="http://remoteserver/about">变成<a href="/mylocation//about">
    我建议这样重写ProxyHTMLURLMap http://remoteserver /mylocation
于 2016-11-21T14:35:52.167 回答
2

我有一个类似的问题,mod替代品对我不起作用。

然后我在某处读到,通常情况下,mod_subsittue 实际上只有在您从服务器获得的 HTTP 响应具有 mime 类型 txt/html 时才有效。

这不是我的情况。我的场景是我想重写 XML 的内容,即被 apache httpd 反向代理的 JEE Web 服务。

为了设法使 mod 替代品更改回复内容,有必要这样做:

<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 的主体。替换端点地址。

于 2019-05-28T18:43:29.553 回答
0

对这个:

但是在日志文件中没有任何 mod_substitute 跟踪

我设法通过使用以下方法在 error.log 中获得了 mod_substitute 跟踪:

LogLevel alert substitute:trace8
于 2021-08-12T14:39:29.107 回答