On this page
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到和从模式进行按请求插值。
如果未启用插值,则会在启动时预编译所有规则。使用插值时,必须为每个请求重新编译它们,这意味着额外的处理开销。因此,仅应在必要时启用它。
ProxyHTMLLinks Directive
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 中的条件的更简单语法。