Apache 模块 mod_proxy_html

Description:重写 HTML 链接,以确保可以在代理上下文中从 Client 端的网络寻址它们。
Status:Base
Module Identifier:proxy_html_module
Source File:mod_proxy_html.c
Compatibility:2.4 版及更高版本。作为早期 2.x 版本的第三方模块提供

Summary

此模块提供输出过滤器,以在代理情况下重写 HTML 链接,以确保链接对代理外部的用户有效。它的作用与 Apache 的ProxyPassReverse指令对 HTTP Headers 的作用相同,并且是反向代理的重要组成部分。

例如,如果公司在appserver.example.com处有一个应用程序服务器,而该服务器仅在公司内部网络中可见,而公共 Web 服务器www.example.com则他们可能希望在http://www.example.com/appserver/提供一个通往应用程序服务器的网关。当应用程序服务器链接到其自身时,需要重写这些链接以通过网关工作。 mod_proxy_html用于将<a href="http://appserver.example.com/foo/bar.html">foobar</a>重写为<a href="http://www.example.com/appserver/foo/bar.html">foobar</a>,使其可以从外部访问。

mod_proxy_html 最初是由 WebÞing 开发的,其广泛的documentation可能对用户有用。

ProxyHTMLBufSize Directive

Description:设置用于缓冲内联脚本和样式表的缓冲区大小增量。
Syntax:ProxyHTMLBufSize bytes
Default:ProxyHTMLBufSize 8192
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为第三方可用于早期的 2.x 版本

为了解析嵌入在 HTML 文档中的非 HTML 内容(样式表和脚本),mod_proxy_html必须将整个脚本或样式表读取到缓冲区中。该缓冲区将根据需要扩展以容纳页面中最大的脚本或样式表,以该指令设置的字节为增量。

默认值为 8192,几乎适用于所有页面。但是,如果您知道要代理的页面包含样式表和/或大于 8K 的脚本(也就是说,对于单个脚本或样式表,不是总和),则设置更大的缓冲区大小会更有效,从而避免了需要在请求期间动态调整缓冲区的大小。

ProxyHTMLCharsetOut Directive

Description:为 mod_proxy_html 输出指定一个字符集。
Syntax:ProxyHTMLCharsetOut Charset | *
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为第三方可用于早期的 2.x 版本

这将为 mod_proxy_html 输出选择一种编码。通常不应该使用它,因为对默认值UTF-8(Unicode-libxml2 内部使用)的任何更改都会带来额外的处理开销。特殊令牌ProxyHTMLCharsetOut *将使用与 Importing 相同的编码来生成输出。

请注意,这取决于mod_xml2enc正在加载。

ProxyHTMLDocType Directive

Description:设置 HTML 或 XHTML 文档类型声明。
Syntax:ProxyHTMLDocType HTML|XHTML [Legacy] OR ProxyHTMLDocType fpi [SGML|XML]
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为第三方可用于早期的 2.x 版本

在第一种形式中,根据所选选项,文档将被声明为 HTML 4.01 或 XHTML 1.0. 此选项还确定是将 HTML 还是 XHTML 语法用于输出。请注意,来自后端服务器的文档格式无关紧要:解析器将自动处理它。如果可选的第二个参数设置为Legacy,则文档将被声明为“过渡”,如果您代理 1998 年之前的内容或使用有缺陷的创作/发布工具,则可能需要使用该选项。

在第二种形式中,它将插入您自己的 FPI。可选的第二个参数确定将使用 SGML/HTML 还是 XML/XHTML 语法。

默认设置更改为忽略任何 FPI,理由是没有 FPI 比伪造的 FPI 好。如果您的后端生成了不错的 HTML 或 XHTML,请相应地进行设置。

如果使用第一种形式,则 mod_proxy_html 还将清理 HTML 到指定的标准。它不能解决所有错误,但会去除伪造的元素和属性。它还可以选择在LogLevel调试中记录其他错误。

ProxyHTMLEnable Directive

Description:打开或关闭 proxy_html 过滤器。
Syntax:ProxyHTMLEnable On|Off
Default:ProxyHTMLEnable Off
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为早期 2.x 版本的第三方模块提供。

一个简单的开关,用于启用或禁用 proxy_html 过滤器。如果加载了mod_xml2enc,它还将自动设置国际化支持。

请注意,proxy_html 过滤器仅对 HTML 数据(Content Type text/html 或 application/xhtml xml)以及代理数据时起作用。您可以通过设置 PROXY_HTML_FORCE 环境变量来覆盖此方法(后果自负)。

ProxyHTMLEvents Directive

Description:指定将属性视为脚本事件。
Syntax:ProxyHTMLEvents attribute [attribute ...]
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为第三方可用于早期的 2.x 版本

指定一个或多个属性,将其视为脚本事件,并将ProxyHTMLURLMap应用于启用的位置。您可以在一个或多个ProxyHTMLEvents指令中指定任意数量的属性。

通常,您将在全局范围内进行设置。如果您在多个范围中设置ProxyHTMLEvents,以便一个覆盖另一个,则需要在每个范围中指定一个完整的集合。

proxy-html.conf 中提供了默认配置,并在标准 HTML 4 和 XHTML 1 中定义了事件。

ProxyHTMLExtended Directive

Description:确定是否修复内联脚本,样式表和脚本事件中的链接。
Syntax:ProxyHTMLExtended On|Off
Default:ProxyHTMLExtended Off
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为第三方可用于早期的 2.x 版本

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

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

您还需要注意匹配的模式,因为解析器不知道嵌入式脚本或样式表中的 URL 是什么。特别是/的扩展匹配可能会导致错误匹配。

ProxyHTMLFixups Directive

Description:修复了简单的 HTML 错误。
Syntax:ProxyHTMLFixups [lowercase] [dospath] [reset]
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为第三方可用于早期的 2.x 版本

该指令采用一到三个参数,如下所示:

  • lowercase网址重写为小写

  • dospath URL 中的反斜杠被重写为正斜杠。

  • reset取消配置中更高级别设置的任何选项。

使用这些时要小心。这些修补程序将纠正某些创作错误,但也有可能错误地修复最初正确的链接。仅当知道后端服务器损坏时才使用它们。

ProxyHTMLInterp Directive

Description:启用ProxyHTMLURLMap规则的按请求插值。
Syntax:ProxyHTMLInterp On|Off
Default:ProxyHTMLInterp Off
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为早期 2.x 版本的第三方模块提供

这样就可以按ProxyHTMLURLMap到和从模式进行按请求插值。

如果未启用插值,则会在启动时预编译所有规则。使用插值时,必须为每个请求重新编译它们,这意味着额外的处理开销。因此,仅应在必要时启用它。

Description:指定具有要重写的 URL 属性的 HTML 元素。
Syntax:ProxyHTMLLinks element attribute [attribute2 ...]
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为第三方可用于早期的 2.x 版本

指定具有 URL 属性的元素,应使用标准ProxyHTMLURLMap重写这些元素。每个元素将需要一个ProxyHTMLLinks指令,但它可以具有任意数量的属性。

通常,您将在全局范围内进行设置。如果您在多个范围中设置ProxyHTMLLinks,以便一个覆盖另一个,则需要在每个范围中指定一个完整的集合。

proxy-html.conf 中提供了默认配置,该默认配置定义了标准 HTML 4 和 XHTML 1 的 HTML 链接。

proxy-html.conf 中的示例

ProxyHTMLLinks  a          href
ProxyHTMLLinks  area       href
ProxyHTMLLinks  link       href
ProxyHTMLLinks  img        src longdesc usemap
ProxyHTMLLinks  object     classid codebase data usemap
ProxyHTMLLinks  q          cite
ProxyHTMLLinks  blockquote cite
ProxyHTMLLinks  ins        cite
ProxyHTMLLinks  del        cite
ProxyHTMLLinks  form       action
ProxyHTMLLinks  input      src usemap
ProxyHTMLLinks  head       profile
ProxyHTMLLinks  base       href
ProxyHTMLLinks  script     src for

ProxyHTMLMeta Directive

Description:打开或关闭 HTML <head>部分中元数据的额外预解析。
Syntax:ProxyHTMLMeta On|Off
Default:ProxyHTMLMeta Off
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为早期 2.x 版本的第三方模块提供。

这将打开或关闭 HTML <head>部分中的元数据预解析。

如果不需要,关闭 ProxyHTMLMeta 可以跳过此解析步骤,从而在性能上有所提升。但是,有时国际化必须正常工作。

ProxyHTMLMeta有两个效果。首先也是最重要的是,它可以检测以以下形式声明的字符编码

<meta http-equiv="Content-Type" content="text/html;charset=foo">

如果是 XHTML 文档,则为 XML 声明。如果字符集是在后端服务器的真实 HTTP Headers 中声明的(总是首选),则不是必需的,或者文档是 utf-8(unicode)或诸如 ASCII 的子集,则不需要。在文档使用通过xml2EncDefault声明的默认值的情况下,您也可以省去它,但是这可能会传播错误的声明。 ProxyHTMLCharsetOut可以消除这种风险,但与启用 ProxyHTMLMeta 相比,处理费用可能更大。

启用ProxyHTMLMeta的另一个效果是解析所有<meta http-equiv=...>声明,并将它们转换为真实的 HTTP Headers,这与 HTML 元素的这种形式的初衷是一致的。

Warning

由于 ProxyHTMLMeta 会将** all http-equiv元素提升为 HTTP Headers,因此仅在信任 HTML 内容与信任上游服务器一样多的情况下才启用它很重要。如果 HTML 由不良行为者控制,则他们可能会向服务器的响应中注入任意的,可能是恶意的 HTTP Headers。

ProxyHTMLStripComments Directive

Description:确定是否删除 HTML Comments。
Syntax:ProxyHTMLStripComments On|Off
Default:ProxyHTMLStripComments Off
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为第三方可用于早期的 2.x 版本

该指令将导致 mod_proxy_html 剥离 HTML Comments。请注意,这也将杀死 Comments 中嵌入的所有脚本或样式(1995 年 6 月与 Netscape 2 引入的一种笨拙性,是为了使以前的浏览器受益,但仍在使用)。它还可能会干扰基于 Comments 的处理器(例如 SSI 或 ESI):如果要删除 Comments,请确保在过滤器链中的所有* before * mod_proxy_html 之前运行!

ProxyHTMLURLMap Directive

Description:定义规则以重写 HTML 链接
Syntax:ProxyHTMLURLMap from-pattern to-pattern [flags] [cond]
Context:服务器配置,虚拟主机,目录
Status:Base
Module:mod_proxy_html
Compatibility:2.4 及更高版本;作为早期 2.x 版本的第三方模块提供。

这是重写 HTML 链接的关键指令。解析文档时,只要链接目标与 from-pattern 匹配,匹配的部分将被重写为 to-pattern,并通过提供的任何标志和ProxyHTMLExtended伪指令进行修改。仅将使用ProxyHTMLLinks指令指定的元素视为 HTML 链接。

可选的第三个参数可以定义以下任何 Flags 。标志区分大小写。

  • h

    • 忽略 HTML 链接(不更改地传递)
  • e

    • 忽略脚本事件(保持不变)
  • c

    • 完整地传递嵌入式脚本和样式部分。
  • L

    • 最后一场 match。如果此规则匹配,则不再应用任何规则(请注意,这对于 HTML 链接会自动发生)。
  • l

    • 与 L 相反。使用 HTML 链接覆盖一次更改的默认行为。
  • R

    • 使用正则表达式匹配和替换。 from-pattern是一个正则表达式,而to-pattern是一个可能基于该正则表达式的替换字符串。支持正则表达式内存:您可以在from-pattern中使用方括号(),并在to-pattern中检索$ 1 至$ 9 的匹配项。

如果未设置 R,它将使用字符串字面量的搜索和替换。逻辑是 HTML 链接中的“从...开始”,而在脚本事件以及嵌入式脚本和样式节中则“包含”。

  • x

    • 使用 POSIX 扩展正则表达式。仅适用于 R。
  • i

    • 不区分大小写的匹配。仅适用于 R。
  • n

    • 禁用正则表达式内存(用于速度)。仅适用于 R。
  • s

    • 基于行的正则表达式匹配。仅适用于 R。
  • ^

    • 仅在开始 match。这仅适用于字符串匹配(不适用于正则表达式),与 HTML 链接无关。
  • $

    • 仅在末尾 match。这仅适用于字符串匹配(不适用于正则表达式),与 HTML 链接无关。
  • V

    • to-pattern中插值环境变量。形式${varname|default}的字符串将被环境变量varname的值替换。如果未设置,则将其替换为default|default是可选的。

注意:仅当ProxyHTMLInterp启用时才会启用插值。

  • v

    • from-pattern中插值环境变量。支持的模式如上所述。

注意:仅当ProxyHTMLInterp启用时才会启用插值。

可选的第四个 cond 参数定义一个条件,只要ProxyHTMLInterp为 On,该条件将按每个请求进行评估。如果条件评估为 FALSE,则该 Map 将不会应用于此请求。如果为 TRUE,或者未定义任何条件,则应用 Map。

_Expression Parser评估。此外,还支持针对 HTTPD 2.0 和 2.2 的 mod_proxy_html 3.x 中的条件的更简单语法。