APACHE 2.4 远程代理 mod_substitute 和 ProxyHTMLExtended 不起作用
Posted
技术标签:
【中文标题】APACHE 2.4 远程代理 mod_substitute 和 ProxyHTMLExtended 不起作用【英文标题】:APACHE 2.4 Remote Proxy mod_substitute and ProxyHTMLExtended don't work 【发布时间】:2017-02-14 13:05:25 【问题描述】:我用 Apache 2.4 在 cento 的 7 服务器上构建了一个反向代理。它适用于标准 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 不起作用?
【问题讨论】:
最简单的解释是底层服务器没有发送配置中两种内容类型中的任何一种的数据。执行网络转储并从删除服务器确认内容类型标头。另外,似乎存在 libxml2 不兼容问题,您可能需要对其进行更新。 【参考方案1】:我会尽力回答你的问题
1) 为何“ProxyHTMLExtended On”规则不解析 Apache 文档中描述的外部 .js 文件?
你说ProxyHTMLExtended
指令:
应该启用对外部 .css 和 .js 文件的解析,但它不起作用。
这似乎是不正确的,current doc 说:
设置为关闭,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/
将在您的网址中添加一个额外的 /
,它仍然有效,但恕我直言,这不是一个好的翻译。
前任。 <a href="http://remoteserver/about">
变为 <a href="/mylocation//about">
我建议像这样重写它ProxyHTMLURLMap http://remoteserver /mylocation
【讨论】:
【参考方案2】:我有一个类似的问题,mod替代对我不起作用。
然后我在某处读到,通常情况下,mod_subsittue 实际上仅在您从服务器获得的 HTTP 响应具有 mime 类型 txt/html 时才有效。
这不是我的方案。 我的场景是我想重写 XML 的内容,即被 apache httpd 反向代理的 JEE Web 服务。
为了设法让模组替代品改变回复内容,有必要这样做:
<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 的主体。替换端点地址。
【讨论】:
【参考方案3】:关于这个:
但在日志文件中没有任何 mod_substitute 跟踪
我设法通过以下方法在 error.log 中获得了 mod_substitute 跟踪:
LogLevel alert substitute:trace8
【讨论】:
以上是关于APACHE 2.4 远程代理 mod_substitute 和 ProxyHTMLExtended 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
带有 VirtualHost 代理的 Apache 2.4 缓存
如何让 Gitlab 6.5 在 Apache 2.4 代理下显示其图标?