我的 Apache 反向代理将代码添加到从 head 标记获取的 HTML 文件的正文中

Posted

技术标签:

【中文标题】我的 Apache 反向代理将代码添加到从 head 标记获取的 HTML 文件的正文中【英文标题】:My Apache reverse proxy adds code to body of fetched HTML files from head tag 【发布时间】:2016-11-05 06:32:53 【问题描述】:

我有一个使用 Apache 2.4.20 的简单反向代理服务器,它从内部 Apache Web 服务器获取 html 文件。页面获取和 URL 重写工作正常,但出现了问题。

任何网页通过代理后,三件事都不正确:head标签的内容出现在body中,head标签丢失,在“p”标签中添加了一个神秘的“>”字符正文标签的顶部。

这个额外的<p>></p> 代码向我表明检测HTML 标记有问题(它可能是<head> 的一部分)。另外,即使 head 标签中没有内容,body 标签仍然以那个奇怪的代码开头。

代理内容 - 在开发者工具、Google Chrome 浏览器中查看:

代理内容 - 提取文件的原始来源:

原始 HTML 文件 - 直接从内部服务器文件系统打开:

代理服务器配置文件 - 关于传输和ProxyHTML的部分:

我知道原始服务器工作正常,所以这不会导致问题。 下面是在浏览器中(在代理服务器设备上)直接从原始服务器查看的 HTML 文件的屏幕截图,以及 Chrome 开发者工具中显示的源代码:

更新:正如预期的那样,mod_proxy_html 是我的问题的主要原因(关闭它会留下原始文件)。但是,这对我来说不是解决方案,因为我需要该工具来重写代理文档中的相对 URL 引用。我阅读了documentation page,但它没有描述任何无疑会导致我的问题的功能。

documentation 中的 mod_proxy_html 指令列表,我认为这些指令不相关,一些经过测试:ProxyHTMLBufSizeProxyHTMLCharsetOutProxyHTMLDocTypeProxyHTMLEnableProxyHTMLEventsProxyHTMLExtended(默认关闭)、ProxyHTMLFixups(根据建议尝试)、ProxyHTMLInterpProxyHTMLLinksProxyHTMLMeta(默认关闭)、ProxyHTMLStripCommentsProxyHTMLURLMap .

【问题讨论】:

我现在使我的帖子更清晰,格式更好,希望它更有用,更容易思考。我目前无法访问提到的服务器,但问题应该是可重现的。 是的,我确认有同样的问题。这很奇怪,因为我对其他站点也使用了相同的反向代理,并且它们工作正常( 未被删除),并且它们具有相同的设置。我通过验证器运行了 html 文件,它没有发出任何警告,但是,proxyhtml 无缘无故地剥离了 和 ,也没有好的结果。 【参考方案1】:

我有同样的问题。但是,在同一台机器上,使用相同反向代理的其他站点运行良好,即使它们具有完全相同的配置,但 URL 不同。我无法理解......除非我注意到有问题的文件在文件开头有BOM signature!

这导致 ProxyHTML 非常混乱,以至于它删除了 <head></head> 标记。

使用dos2unix 实用程序删除 BOM 后,文件显示正确。

你的帖子给了我更多的动力来解决这个问题。谢谢。

【讨论】:

【参考方案2】:

你正在使用 mod_proxy_html

此模组将尝试根据指令影响代理的 HTML 资源。我的建议是删除 ProxyHTML 指令,看看会发生什么。如果它不受影响,那么您就知道它与 mod_proxy_html 有关。

然后看看在ProxyHTMLEnable下面添加这个指令

ProxyHTMLFixups off

【讨论】:

正如我所怀疑的,mod_proxy_html 导致了我的问题(关闭它可以解决问题)。这对我来说不是一个解决方案,因为我需要它来重写代理文档中的相对 URL 引用。另外,尝试ProxyHTMLFixups off 没有用(看看它的documentation,我不明白为什么它会导致错误)。看着整个documentation,我不知道是什么导致了我的问题。 我现在使我的帖子更清晰,格式更好,希望它更有用,更容易思考。如果您有任何想法,您可以提供更多想法。我目前无法访问提到的服务器,但问题应该是可重现的。【参考方案3】:

你的问题是文档类型定义

<!DOCTYPE html/>

标签不应关闭。它应该是这样的:

<!DOCTYPE html>

mod_proxy_html 尝试通过将其包装在段落中来修复它所看到的额外 &gt; 字符。

【讨论】:

以上是关于我的 Apache 反向代理将代码添加到从 head 标记获取的 HTML 文件的正文中的主要内容,如果未能解决你的问题,请参考以下文章

Apache反向代理配置

10. Nginx实现反向代理

查尔斯代理将代码添加到头部标签中

HTTP/2 的 Apache 反向代理将丢失 MIME 类型并使用默认值

Apache 反向代理背后的 Apache Zeppelin

Apache 反向代理实现为http添加https的外衣