<-
Apache > HTTP 服务器 > 文档 > 2.4 版 > 模块

Apache 模块 mod_proxy

可用语言:  en  |  fr  |  ja 

描述多协议代理/网关服务器
状态扩展
模块标识符proxy_module
源文件mod_proxy.c

摘要

警告

在您保护您的服务器之前,请勿使用 ProxyRequests 启用代理。开放代理服务器对您的网络和整个互联网都构成危险。

mod_proxy 及其相关模块为 Apache HTTP Server 实现了一个代理/网关,支持多种流行协议以及几种不同的负载均衡算法。第三方模块可以添加对其他协议和负载均衡算法的支持。

必须将一组模块加载到服务器中才能提供必要的特性。这些模块可以在构建时静态包含,也可以通过 LoadModule 指令动态包含。该集合必须包括

此外,其他模块还提供了扩展功能。缓存由 mod_cache 及其相关模块提供。使用 SSL/TLS 协议联系远程服务器的功能由 mod_sslSSLProxy* 指令提供。这些附加模块需要加载和配置才能利用这些功能。

Support Apache!

主题

指令

错误修复清单

另请参见

top

正向代理和反向代理/网关

Apache HTTP Server 可以配置为 正向 代理和 反向 代理(也称为 网关)模式。

普通的 正向代理 是一个中间服务器,位于客户端和源服务器之间。为了从源服务器获取内容,客户端向代理发送一个请求,将源服务器命名为目标。然后,代理从源服务器请求内容并将其返回给客户端。客户端必须专门配置为使用正向代理访问其他站点。

正向代理的典型用法是为受防火墙限制的内部客户端提供 Internet 访问。正向代理还可以使用缓存(由 mod_cache 提供)来减少网络使用。

正向代理使用 ProxyRequests 指令激活。因为正向代理允许客户端通过您的服务器访问任意站点并隐藏其真实来源,所以您必须保护您的服务器,以便只有授权的客户端才能在激活正向代理之前访问代理。

相反,反向代理(或 网关)对客户端来说就像一个普通的 Web 服务器。客户端不需要进行任何特殊配置。客户端对反向代理命名空间中的内容发出普通请求。然后,反向代理决定将这些请求发送到哪里,并将内容返回,就好像它本身是源服务器一样。

反向代理的典型用法是为位于防火墙后面的服务器提供 Internet 用户访问。反向代理还可以用于在多个后端服务器之间平衡负载或为较慢的后端服务器提供缓存。此外,反向代理可以简单地用于将多个服务器引入同一个 URL 空间。

反向代理使用 ProxyPass 指令或 RewriteRule 指令的 [P] 标志激活。不需要打开 ProxyRequests 才能配置反向代理。

top

基本示例

以下示例只是帮助您入门的非常基本的想法。请阅读有关各个指令的文档。

此外,如果您希望启用缓存,请查阅 mod_cache 的文档。

反向代理

ProxyPass "/foo" "http://foo.example.com/bar"
ProxyPassReverse "/foo" "http://foo.example.com/bar"

正向代理

ProxyRequests On
ProxyVia On

<Proxy "*">
  Require host internal.example.com
</Proxy>

Websocket 升级(2.4.47 及更高版本)

ProxyPass "/some/ws/capable/path/" "http://example.com/some/ws/capable/path/" upgrade=websocket
top

通过处理程序访问

您还可以通过创建合适的处理程序传递来强制将请求作为反向代理请求处理。以下示例配置将使用反向代理将所有对 PHP 脚本的请求传递到指定的 FastCGI 服务器

反向代理 PHP 脚本

<FilesMatch "\.php$">
    # Unix sockets require 2.4.7 or later
    SetHandler  "proxy:unix:/path/to/app.sock|fcgi://localhost/"
</FilesMatch>

此功能在 Apache HTTP Server 2.4.10 及更高版本中可用。

top

工作者

代理在称为 工作者 的对象中管理源服务器的配置及其通信参数。有两个内置工作者:默认正向代理工作者和默认反向代理工作者。可以显式配置其他工作者。

两个默认工作者具有固定的配置,如果没有任何其他工作者匹配请求,则将使用它们。它们不使用 HTTP Keep-Alive 或连接重用。相反,将为每个请求打开和关闭到源服务器的 TCP 连接。

显式配置的工作者由其 URL 标识。它们通常使用 ProxyPassProxyPassMatch 在反向代理中使用时创建和配置

ProxyPass "/example" "http://backend.example.com" connectiontimeout=5 timeout=30

这将创建一个与源服务器 URL http://backend.example.com 关联的工作者,该工作者将使用给定的超时值。在正向代理中使用时,工作者通常通过 ProxySet 指令定义

ProxySet "http://backend.example.com" connectiontimeout=5 timeout=30

或者可以使用 ProxyProxySet

<Proxy "http://backend.example.com">
  ProxySet connectiontimeout=5 timeout=30
</Proxy>

在正向模式下使用显式配置的工作者并不常见,因为正向代理通常与许多不同的源服务器通信。如果某些源服务器使用频率很高,那么为它们创建显式工作者仍然很有用。显式配置的工作者本身没有正向或反向代理的概念。它们封装了与源服务器通信的通用概念。由 ProxyPass 创建的用于反向代理的工作者,只要源服务器的 URL 与工作者 URL 匹配,也会用于正向代理请求,反之亦然。

标识直接工作者的 URL 是其源服务器的 URL,包括给定的任何路径组件

ProxyPass "/examples" "http://backend.example.com/examples"
ProxyPass "/docs" "http://backend.example.com/docs"

此示例定义了两个不同的工作者,每个工作者使用单独的连接池和配置。

工作者共享

如果工作者 URL 重叠,则会发生工作者共享,这种情况发生在某个工作者的 URL 是配置文件中稍后定义的另一个工作者的 URL 的前导子字符串时。在以下示例中

ProxyPass "/apps" "http://backend.example.com/" timeout=60
ProxyPass "/examples" "http://backend.example.com/examples" timeout=10

实际上并没有创建第二个工作者。相反,将使用第一个工作者。好处是,只有一个连接池,因此连接更常被重用。请注意,为后来的工作者显式给出的所有配置属性都将被忽略。这将被记录为警告。在上面的示例中,URL /examples 的最终超时值为 60 而不是 10

如果您想避免工作者共享,请按 URL 长度对工作者定义进行排序,从最长的工作者 URL 开始。如果您想最大限度地共享工作者,请使用反向排序顺序。另请参见有关排序 ProxyPass 指令的相关警告。

显式配置的 worker 有两种类型:直接 worker(负载) balancer worker。它们支持许多重要的配置属性,这些属性将在下面的 ProxyPass 指令中描述。相同的属性也可以使用 ProxySet 设置。

直接 worker 可用的选项集取决于在源服务器 URL 中指定的协议。可用的协议包括 ajpfcgiftphttpscgi

Balancer worker 是虚拟 worker,它们使用称为其成员的直接 worker 来实际处理请求。每个 balancer 可以有多个成员。当它处理请求时,它会根据配置的负载均衡算法选择一个成员。

如果其 worker URL 使用 balancer 作为协议方案,则会创建一个 balancer worker。balancer URL 唯一标识 balancer worker。使用 BalancerMember 将成员添加到 balancer。

源域名的 DNS 解析

DNS 解析发生在首次创建到源域名的套接字时。当启用连接重用时,每个后端域名仅在每个子进程中解析一次,并在所有后续连接中缓存,直到子进程被回收。在计划涉及后端域名的 DNS 维护任务时,应考虑此信息。请还查看 ProxyPass 参数以了解有关连接重用的更多详细信息。

top

控制对代理的访问

您可以通过 <Proxy> 控制块控制谁可以访问您的代理,如下例所示

<Proxy "*">
  Require ip 192.168.0
</Proxy>

有关访问控制指令的更多信息,请参见 mod_authz_host

如果您使用的是正向代理(使用 ProxyRequests 指令),则严格限制访问至关重要。否则,您的服务器可以被任何客户端用来访问任意主机,同时隐藏其真实身份。这对您的网络和整个互联网来说都是危险的。当使用反向代理(使用 ProxyPass 指令,其中 ProxyRequests Off)时,访问控制不太重要,因为客户端只能联系您已明确配置的主机。

另请参见 Proxy-Chain-Auth 环境变量。

top

启动缓慢

如果您使用的是 ProxyBlock 指令,则主机名的 IP 地址将在启动期间查找并缓存,以便以后进行匹配测试。这可能需要几秒钟(或更长时间),具体取决于主机名查找的速度。

top

内联网代理

位于内联网中的 Apache httpd 代理服务器需要通过公司的防火墙转发外部请求(为此,请配置 ProxyRemote 指令以将相应的 scheme 转发到防火墙代理)。但是,当它必须访问内联网中的资源时,它可以在访问主机时绕过防火墙。 NoProxy 指令对于指定哪些主机属于内联网并应直接访问很有用。

内联网中的用户倾向于从其 WWW 请求中省略本地域名,因此请求 "http://somehost/" 而不是 http://somehost.example.com/。一些商业代理服务器允许他们摆脱这种困境,并简单地提供请求,这意味着配置了本地域名。当使用 ProxyDomain 指令并且服务器 配置为代理服务 时,Apache httpd 可以返回重定向响应并将客户端发送到正确的、完全限定的服务器地址。这是首选方法,因为用户的书签文件将包含完全限定的主机。

top

协议调整

对于 mod_proxy 向未正确实现 keepalives 或 HTTP/1.1 的源服务器发送请求的情况,有两个 环境变量 可以强制请求使用 HTTP/1.0 且不使用 keepalive。这些是通过 SetEnv 指令设置的。

这些是 force-proxy-request-1.0proxy-nokeepalive 注释。

<Location "/buggyappserver/">
  ProxyPass "http://buggyappserver:7001/foo/"
  SetEnv force-proxy-request-1.0 1
  SetEnv proxy-nokeepalive 1
</Location>

在 2.4.26 及更高版本中,可以设置 "no-proxy" 环境变量以禁用 mod_proxy 处理当前请求。此变量应使用 SetEnvIf 设置,因为 SetEnv 的评估时间不够早。

top

请求主体

一些请求方法(如 POST)包含请求主体。HTTP 协议要求包含主体的请求要么使用分块传输编码,要么发送 Content-Length 请求头。当将这些请求传递给源服务器时,mod_proxy_http 将始终尝试发送 Content-Length。但是,如果主体很大并且原始请求使用分块编码,则上游请求中也可能使用分块编码。您可以使用 环境变量 控制此选择。设置 proxy-sendcl 通过始终发送 Content-Length 来确保与上游服务器的最大兼容性,而设置 proxy-sendchunked 通过使用分块编码来最大限度地减少资源使用。

在某些情况下,服务器必须将请求主体转储到磁盘以满足对请求主体处理的请求。例如,如果原始主体使用分块编码发送(并且很大),但管理员要求将后端请求发送为 Content-Length 或 HTTP/1.0,则会发生此转储。如果请求主体已经具有 Content-Length 标头,但服务器配置为过滤传入的请求主体,则也会发生此转储。

top

反向代理请求头

当以反向代理模式运行(例如,使用 ProxyPass 指令)时,mod_proxy_http 会添加几个请求头以将信息传递给源服务器。这些头是

X-Forwarded-For
客户端的 IP 地址。
X-Forwarded-Host
客户端在 Host HTTP 请求头中请求的原始主机。
X-Forwarded-Server
代理服务器的主机名。

在源服务器上使用这些头时要小心,因为如果原始请求已经包含其中一个头,它们将包含多个(逗号分隔)值。例如,您可以在源服务器的日志格式字符串中使用 %{X-Forwarded-For}i 来记录原始客户端的 IP 地址,但如果请求通过多个代理,您可能会获得多个地址。

另请参见 ProxyPreserveHostProxyVia 指令,它们控制其他请求头。

注意:如果您需要指定要添加到转发请求的自定义请求头,请使用 RequestHeader 指令。

top

BalancerGrowth 指令

描述可以添加的额外 Balancer 的数量,这些 Balancer 可以通过后配置添加
语法BalancerGrowth #
默认值BalancerGrowth 5
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy
兼容性BalancerGrowth 仅在 Apache HTTP Server 2.3.13 及更高版本中可用。

此指令允许在虚拟主机中为 Balancer 的数量提供增长潜力,除了预先配置的数量之外。它仅在至少有一个预先配置的 Balancer 时才生效。

top

BalancerInherit 指令

描述从主服务器继承 ProxyPassed Balancer/Worker
语法BalancerInherit On|Off
默认值BalancerInherit On
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy
兼容性BalancerInherit 仅在 Apache HTTP Server 2.4.5 及更高版本中可用。

此指令将导致当前服务器/虚拟主机“继承”在主服务器中定义的 ProxyPass Balancer 和 Worker。如果使用 Balancer Manager,这可能会导致问题和不一致的行为,因此如果使用该功能,应将其禁用。

全局服务器中的设置定义了所有虚拟主机的默认值。

top

BalancerMember 指令

描述将成员添加到负载均衡组
语法BalancerMember [balancerurl] url [key=value [key=value ...]]
上下文目录
状态扩展
模块mod_proxy
兼容性BalancerMember 仅在 Apache HTTP Server 2.2 及更高版本中可用。

此指令将成员添加到负载均衡组。它可以在 <Proxy balancer://...> 容器指令中使用,并且可以采用 ProxyPass 指令可用的任何键值对参数。

只有一个额外的参数仅对 BalancerMember 指令可用:loadfactor。这是成员负载系数 - 一个介于 1.0(默认值)和 100.0 之间的十进制数,它定义了要应用于该成员的加权负载。

仅当不在 <Proxy balancer://...> 容器指令中时才需要 balancerurl。它对应于在 ProxyPass 指令中定义的 balancer 的 url。

任何 <Proxy balancer://...> 容器指令中的 balancer URL 的路径组件将被忽略。

通常应从 BalancerMember 的 URL 中删除尾部斜杠。

top

BalancerPersist 指令

描述尝试在重启之间持久化 Balancer Manager 所做的更改。
语法BalancerPersist On|Off
默认值BalancerPersist Off
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy
兼容性BalancerPersist 仅在 Apache HTTP Server 2.4.4 及更高版本中可用。

此指令将导致与 balancer 和 balancer 成员关联的共享内存存储在重启之间持久化。这允许这些本地更改在正常的重启/优雅状态转换期间不会丢失。

top

NoProxy 指令

描述将直接连接到的主机、域名或网络
语法NoProxy host [host] ...
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

此指令仅适用于内联网中的 Apache httpd 代理服务器。 NoProxy 指令指定一个由空格分隔的子网、IP 地址、主机和/或域列表。对与其中一个或多个匹配的主机的请求将始终直接提供服务,而不会转发到配置的 ProxyRemote 代理服务器。

示例

ProxyRemote  "*"  "http://firewall.example.com:81"
NoProxy         ".example.com" "192.168.112.0/21"

NoProxy 指令的 host 参数是以下类型列表之一

一个 是一个部分限定的 DNS 域名,前面有一个句点。它代表一个逻辑上属于同一个 DNS 域或区域的主机列表(,主机名的后缀都以 结尾)。

示例

.com .example.org.

为了区分 主机名(在语法和语义上;DNS 域也可以有 DNS A 记录!), 始终以一个句点开头。

注意

域名比较不区分大小写,并且 始终被认为是锚定在 DNS 树的根目录中;因此,两个域 .ExAmple.com.example.com.(注意尾部的句点)被认为是相等的。由于域比较不涉及 DNS 查询,因此它比子网比较效率更高。

子网

一个 子网 是一个部分限定的互联网地址,以数字(点分十进制)形式表示,后面可以选择跟一个斜杠和网络掩码,以 子网 中有效位的数量指定。它用于表示可以通过公共网络接口访问的主机子网。在没有显式网络掩码的情况下,假设省略(或值为零)的尾部数字指定掩码。(在这种情况下,网络掩码只能是 8 位宽的倍数。)示例

192.168192.168.0.0
子网 192.168.0.0,隐含网络掩码为 16 个有效位(有时在网络掩码形式 255.255.0.0 中使用)
192.168.112.0/21
子网 192.168.112.0/21,网络掩码为 21 个有效位(也以 255.255.248.0 的形式使用)

作为一种退化情况,具有 32 个有效位的 子网 等效于一个 IPAddr,而具有零个有效位的 子网例如,0.0.0.0/0)与常量 _Default_ 相同,匹配任何 IP 地址。

IPAddr

一个 IPAddr 代表一个以数字(点分十进制)形式表示的完全限定的互联网地址。通常,此地址代表一个主机,但不必一定与地址关联一个 DNS 域名。

示例

192.168.123.7

注意

一个 IPAddr 不需要由 DNS 系统解析,因此它可以提高 Apache 的性能。

主机名

一个 主机名 是一个完全限定的 DNS 域名,可以通过 DNS 域名服务解析为一个或多个 IPAddrs。它代表一个逻辑主机(与 相反,见上文),并且必须解析为至少一个 IPAddr(或者通常解析为具有不同 IPAddr 的主机列表)。

示例

prep.ai.example.edu
www.example.org

注意

在许多情况下,指定一个 IPAddr 来代替 主机名 更有效,因为可以避免 DNS 查询。当连接到名称服务器使用慢速 PPP 链路时,Apache httpd 中的名称解析可能需要相当长的时间。

主机名 比较不区分大小写,并且 主机名 始终被认为是锚定在 DNS 树的根目录中;因此,两个主机 WWW.ExAmple.comwww.example.com.(注意尾部的句点)被认为是相等的。

另请参见

top

<Proxy> 指令

描述应用于代理资源的指令的容器
语法<Proxy 通配符 URL> ...</Proxy>
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

放置在 <Proxy> 部分中的指令仅适用于匹配的代理内容。允许使用 shell 风格的通配符。

例如,以下内容将只允许 yournetwork.example.com 中的主机通过您的代理服务器访问内容

<Proxy "*">
  Require host yournetwork.example.com
</Proxy>

以下示例将在通过代理服务器发送时,通过 INCLUDES 过滤器处理 example.comfoo 目录中的所有文件

<Proxy "http://example.com/foo/*">
  SetOutputFilter INCLUDES
</Proxy>

与 Location 配置部分的差异

如果后端 URL 以 通配符 URL 字符串开头,则它将匹配配置部分,即使指令中的最后一个路径段仅匹配后端 URL 的前缀。例如,<Proxy "http://example.com/foo"> 匹配所有 http://example.com/foo、http://example.com/foo/bar 和 http://example.com/foobar。最终 URL 的匹配与 <Location> 部分的行为不同,为了便于说明,该部分将最终路径组件视为以斜杠结尾。

要更精确地控制匹配,请参见 <ProxyMatch>

另请参见

top

Proxy100Continue 指令

描述将 100 继续期望转发到源服务器
语法Proxy100Continue Off|On
默认值Proxy100Continue On
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy
兼容性在 2.4.40 及更高版本中可用

此指令确定代理是否应将 100 继续 Expect:ation 转发到源服务器,从而让它决定何时/是否应读取 HTTP 请求正文,或者当 Off 时,代理应在转发请求正文之前自行生成 100 Continue 中间响应。

有效性

此选项仅适用于 HTTP 代理,如 mod_proxy_http 所处理。

top

ProxyAddHeaders 指令

描述在 X-Forwarded-* 标头中添加代理信息
语法ProxyAddHeaders Off|On
默认值ProxyAddHeaders On
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy
兼容性在 2.3.10 及更高版本中可用

此指令确定是否应通过 X-Forwarded-For、X-Forwarded-Host 和 X-Forwarded-Server HTTP 标头将代理相关信息传递到后端服务器。

有效性

此选项仅适用于 HTTP 代理,如 mod_proxy_http 所处理。

top

ProxyBadHeader 指令

描述确定如何处理响应中的错误标头行
语法ProxyBadHeader IsError|Ignore|StartBody
默认值ProxyBadHeader IsError
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

ProxyBadHeader 指令确定 mod_proxy 在从源服务器接收语法上无效的响应标头行(,不包含冒号)时的行为。以下参数是可能的

IsError
中止请求并最终返回 502(错误网关)响应。这是默认行为。
Ignore
将错误标头行视为未发送。
StartBody
当接收到第一个错误标头行时,完成标头读取并将剩余部分视为正文。这有助于解决忘记在标头和正文之间插入空行的错误后端服务器。
top

ProxyBlock 指令

描述禁止代理的单词、主机或域
语法ProxyBlock *|word|host|domain [word|host|domain] ...
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

ProxyBlock 指令指定一个由空格分隔的单词、主机和/或域列表。对名称包含匹配的单词、主机或域的网站的 HTTP、HTTPS 和 FTP 文档请求将被代理服务器 阻止。代理模块还将尝试在启动时确定列表项的 IP 地址(这些地址可能是主机名),并将它们缓存以进行匹配测试。这可能会减慢服务器的启动时间。

示例

ProxyBlock "news.example.com" "auctions.example.com" "friends.example.com"

请注意,example 也足以匹配以下任何网站。

如果通过 IP 地址引用,主机也会被匹配。

还要注意

ProxyBlock "*"

阻止与所有网站的连接。

top

ProxyDomain 指令

描述代理请求的默认域名
语法ProxyDomain Domain
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

此指令仅适用于内联网中的 Apache httpd 代理服务器。 ProxyDomain 指令指定 Apache 代理服务器将所属的默认域。如果遇到对没有域名的主机的请求,将生成一个重定向响应,将配置的 Domain 附加到相同主机。

示例

ProxyRemote  "*"  "http://firewall.example.com:81"
NoProxy         ".example.com" "192.168.112.0/21"
ProxyDomain     ".example.com"
top

ProxyErrorOverride 指令

描述覆盖代理内容的错误页面
语法ProxyErrorOverride Off|On [code ...]
默认值ProxyErrorOverride Off
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy
兼容性状态码列表在 2.4.47 中添加

此指令对于反向代理设置很有用,在这些设置中,您希望在最终用户看到的错误页面上具有统一的外观。这也允许包含文件(通过 mod_include 的 SSI)获取错误代码并相应地采取行动。(默认行为将显示代理服务器的错误页面。启用此选项将显示 SSI 错误消息。)

此指令不会影响信息性 (1xx)、正常成功 (2xx) 或重定向 (3xx) 响应的处理。

默认情况下,ProxyErrorOverride 会影响所有代码介于 400(包括)和 600(不包括)之间的响应。

默认行为示例

ProxyErrorOverride  On

要更改默认行为,您可以指定要考虑的状态码,用空格分隔。如果您这样做,所有其他状态码将被忽略。您只能指定被视为错误代码的状态码:介于 400(包括)和 600(不包括)之间。

自定义状态码示例

ProxyErrorOverride  On 403 405 500 501 502 503 504
top

ProxyIOBufferSize 指令

描述确定内部数据吞吐缓冲区的大小
语法ProxyIOBufferSize bytes
默认值ProxyIOBufferSize 8192
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

ProxyIOBufferSize 指令调整内部缓冲区的大小,该缓冲区用作输入和输出之间数据的临时存储区。大小必须至少为 512

几乎在所有情况下,都没有理由更改该值。

如果与 AJP 一起使用,此指令将设置以字节为单位的最大 AJP 数据包大小。大于 65536 的值将设置为 65536。如果您从默认值更改它,您还必须更改 Tomcat 端 AJP 连接器上的 packetSize 属性!属性 packetSize 仅在 Tomcat 5.5.20+6.0.2+ 中可用

通常没有必要更改最大数据包大小。在发送证书或证书链时,已报告默认值的出现问题。

top

<ProxyMatch> 指令

描述应用于正则表达式匹配的代理资源的指令的容器
语法<ProxyMatch regex> ...</ProxyMatch>
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

<ProxyMatch> 指令与 <Proxy> 指令相同,只是它使用 正则表达式 匹配 URL。

从 2.4.8 开始,命名的组和反向引用被捕获并写入环境,相应的名称以 "MATCH_" 为前缀并大写。这允许在 表达式mod_rewrite 等模块中引用 URL 的元素。为了避免混淆,编号(未命名)的反向引用将被忽略。请改用命名组。

<ProxyMatch "^http://(?<sitename>[^/]+)">
    Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</ProxyMatch>

另请参见

top

ProxyMaxForwards 指令

描述请求可以转发通过的最大代理数量
语法ProxyMaxForwards number
默认值ProxyMaxForwards -1
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy
兼容性默认行为在 2.2.7 中更改

ProxyMaxForwards 指令指定如果请求没有提供 Max-Forwards 标头,则请求可以经过的最大代理数量。这可以设置为防止无限代理循环或 DoS 攻击。

示例

ProxyMaxForwards 15

请注意,设置 ProxyMaxForwards 违反了 HTTP/1.1 协议 (RFC2616),该协议禁止代理在客户端未设置的情况下设置 Max-Forwards。早期的 Apache httpd 版本总是会设置它。负数的 ProxyMaxForwards 值(包括默认值 -1)可以提供符合协议的行为,但可能会使您容易受到循环攻击。

top

ProxyPass 指令

描述将远程服务器映射到本地服务器的 URL 空间
语法ProxyPass [path] !|url [key=value [key=value ...]] [nocanon] [interpolate] [noquery]
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy
兼容性Unix 域套接字 (UDS) 支持在 2.4.7 中添加

此指令允许将远程服务器映射到本地服务器的空间。本地服务器不会以传统意义上的代理方式运行,而是看起来像是远程服务器的镜像。本地服务器通常被称为 反向代理网关path 是本地虚拟路径的名称; url 是远程服务器的 URL 部分,不能包含查询字符串。

强烈建议在继续本节内容之前,先回顾一下 工作进程 的概念。
此指令在 <Directory><If><Files> 容器中不受支持。
当使用 ProxyPass 时,通常应将 ProxyRequests 指令设置为 关闭

在 2.4.7 及更高版本中,通过使用以 unix:/path/lis.sock| 开头的目标,可以使用 Unix 域套接字。例如,要代理 HTTP 并将目标设置为 /home/www.socket 上的 UDS,可以使用 unix:/home/www.socket|http://localhost/whatever/

注意:unix: URL 关联的路径是 DefaultRuntimeDir 意识的。

当在 <Location> 部分内使用时,第一个参数将被省略,本地目录将从 <Location> 中获取。在 <LocationMatch> 部分内也会发生同样的情况;但是,ProxyPass 不会将正则表达式解释为正则表达式,因此在这种情况下,需要使用 ProxyPassMatch

假设本地服务器的地址为 http://example.com/;那么

<Location "/mirror/foo/">
    ProxyPass "http://backend.example.com/"
</Location>

将导致对 http://example.com/mirror/foo/bar 的本地请求在内部转换为对 http://backend.example.com/bar 的代理请求。

如果您需要更灵活的反向代理配置,请参阅带有 [P] 标志的 RewriteRule 指令。

以下替代语法是可能的;但是,当存在大量此类语法时,它可能会带来性能损失。以下语法的优点是它允许通过 Balancer Manager 接口进行动态控制

ProxyPass "/mirror/foo/" "http://backend.example.com/"

如果第一个参数以尾部的 / 结尾,则第二个参数也应该以尾部的 / 结尾,反之亦然。否则,对后端的请求可能会丢失一些必要的斜杠,并且不会提供预期的结果。

! 指令在您不想反向代理子目录的情况下很有用,例如

<Location "/mirror/foo/">
    ProxyPass "http://backend.example.com/"
</Location>
<Location "/mirror/foo/i">
    ProxyPass "!"
</Location>
ProxyPass "/mirror/foo/i" "!"
ProxyPass "/mirror/foo" "http://backend.example.com"

将代理所有对 /mirror/foo 的请求到 backend.example.com除了/mirror/foo/i 的请求。

在不同上下文中混合使用 ProxyPass 设置不起作用

ProxyPass "/mirror/foo/i" "!"
<Location "/mirror/foo/">
    ProxyPass "http://backend.example.com/"
</Location>

在这种情况下,对 /mirror/foo/i 的请求将被代理,因为 Location 块中的 ProxyPass 指令将首先被评估。 ProxyPass 支持服务器和目录上下文这一事实并不意味着它们在配置文件中的范围和位置将保证任何排序或覆盖。

排序 ProxyPass 指令

配置的 ProxyPassProxyPassMatch 规则将按照配置顺序进行检查。第一个匹配的规则获胜。因此,通常您应该对冲突的 ProxyPass 规则进行排序,从最长的 URL 开始。否则,较长的 URL 的后续规则将被任何使用 URL 的前导子字符串的早期规则隐藏。请注意,这与工作进程共享有一些关系。

在 Location 中排序 ProxyPass 指令

在一个 Location 块中只能放置一个 ProxyPass 指令,并且最具体的 Location 将优先。

排除项和 no-proxy 环境变量

排除项必须放在一般的 ProxyPass 指令之前。在 2.4.26 及更高版本中,"no-proxy" 环境变量是排除项的替代方法,也是在 Location 上下文中配置 ProxyPass 指令排除的唯一方法。此变量应使用 SetEnvIf 设置,因为 SetEnv 的评估时间不够早。

ProxyPass key=value 参数

在 Apache HTTP Server 2.1 及更高版本中,mod_proxy 支持对后端服务器进行池化连接。按需创建的连接可以保留在池中以供将来使用。池大小限制和其他设置可以使用以下表格中描述的 ProxyPass 指令中的 key=value 参数进行编码。

到后端的最大连接数

默认情况下,mod_proxy 将允许并保留该 Web 服务器子进程可以同时使用的最大连接数。使用 max 参数可以将该数字从默认值减少。连接池是针对每个 Web 服务器子进程维护的,并且 max 和其他设置不会在所有子进程之间协调,除非配置或 MPM 设计只允许一个子进程。

使用 ttl 参数可以设置可选的生存时间;至少 ttl 秒内未使用的连接将被关闭。 ttl 可用于避免使用由于后端服务器的保持活动超时而可能关闭的连接。

示例

ProxyPass "/example" "http://backend.example.com" max=20 ttl=120 retry=300
工作进程 | BalancerMember 参数
参数 默认值 描述
min 0 连接池条目的最小数量,与实际连接数量无关。这只需要在特殊情况下修改默认值,在这些情况下,与后端连接相关的堆内存应该预先分配或保留。
max 1...n 允许到后端服务器的最大连接数。此限制的默认值为活动 MPM 中每个进程的线程数。在 Prefork MPM 中,这始终为 1,而在其他 MPM 中,它由 ThreadsPerChild 指令控制。
smax max 如果超过此限制,保留的连接池条目将在某些操作期间被释放,前提是它们在超过由 ttl 参数控制的生存时间后一直未使用。如果连接池条目具有关联的连接,则该连接将被关闭。这只需要在特殊情况下修改默认值,在这些情况下,需要更积极地释放或关闭超过生存时间的连接池条目和任何关联的连接。
acquire - 如果设置,这将是等待连接池中空闲连接的最大时间(以毫秒为单位)。如果池中没有空闲连接,Apache httpd 将向客户端返回 SERVER_BUSY 状态。
connectiontimeout timeout 连接超时时间(以秒为单位)。Apache httpd 等待与后端建立连接完成的秒数。通过添加后缀 ms,超时时间也可以设置为毫秒。
disablereuse Off 当您希望强制 mod_proxy 在使用后立即关闭与后端的连接时,应使用此参数,从而禁用对该后端的持久连接和池。这有助于解决各种情况,在这些情况下,Apache httpd 和后端服务器之间的防火墙(无论协议如何)往往会静默地丢弃连接,或者后端本身可能处于轮询 DNS 中。当启用连接重用时,每个后端域只会在每个子进程中解析一次(使用 DNS 查询),并缓存以供所有后续连接使用,直到子进程被回收。要禁用连接重用,请将此属性值设置为 On
enablereuse On 这是上面 "disablereuse" 的反面,提供给需要选择加入连接重用的方案处理程序(例如 mod_proxy_fcgi)。2.4.11 及更高版本。
flushpackets off 确定代理模块是否会在发送每个数据“块”后自动刷新输出旅馆。'off' 表示它只会在需要时刷新;'on' 表示在发送每个块后刷新;'auto' 表示轮询/等待一段时间,如果在 'flushwait' 毫秒内没有收到输入,则刷新。目前,这仅对 mod_proxy_ajp 和 mod_proxy_fcgi 有效。
flushwait 10 如果 'flushpackets' 为 'auto',则在刷新输出旅馆之前等待额外输入的时间(以毫秒为单位)。
iobuffersize 8192 调整内部暂存盘 IO 缓冲区的大小。这允许您为特定工作进程覆盖 ProxyIOBufferSize。这必须至少为 512 或设置为 0 以使用系统的默认值 8192。
responsefieldsize 8192 调整代理响应字段缓冲区的大小。缓冲区大小应至少为从代理响应中预期到的最大标头大小。将该值设置为 0 将使用系统的默认值 8192 字节。
在 Apache HTTP Server 2.4.34 及更高版本中可用。
keepalive Off

当您在 Apache httpd 和后端服务器之间有防火墙,并且该防火墙倾向于丢弃非活动连接时,应使用此参数。此标志将告诉操作系统在非活动连接上发送 KEEP_ALIVE 消息,从而防止防火墙丢弃连接。要启用保持活动,请将此属性值设置为 On

初始和后续 TCP 保活探测的频率取决于全局操作系统设置,可能高达 2 小时。为了有效,操作系统中配置的频率必须小于防火墙使用的阈值。

lbset 0 设置工作器所属的负载均衡器集群集。负载均衡器将在尝试更高编号的 lbset 之前尝试所有较低编号的 lbset 成员。
ping 0 Ping 属性告诉 Web 服务器在转发请求之前“测试”与后端的连接。对于 AJP,它会导致 mod_proxy_ajp 在 ajp13 连接上发送 CPING 请求(在 Tomcat 3.3.2+、4.1.28+ 和 5.0.13+ 上实现)。对于 HTTP,它会导致 mod_proxy_http 向后端发送 100-Continue(仅对 HTTP/1.1 有效 - 对于非 HTTP/1.1 后端,此属性无效)。在这两种情况下,参数都是等待回复的延迟时间(以秒为单位)。此功能已添加以避免挂起和繁忙的后端问题。这将在正常操作期间增加网络流量,这可能是一个问题,但它将在某些集群节点关闭或繁忙的情况下降低流量。通过添加后缀 ms,延迟也可以以毫秒为单位设置。
receivebuffersize 0 调整代理连接的显式(TCP/IP)网络缓冲区大小。这允许您为特定工作器覆盖 ProxyReceiveBufferSize。这必须至少为 512 或设置为 0 以使用系统默认值。
redirect - 工作器的重定向路由。此值通常动态设置以启用从集群中安全删除节点。如果设置,所有没有会话 ID 的请求都将重定向到路由参数等于此值的 BalancerMember。
retry 60 连接池工作器重试超时(以秒为单位)。如果与后端服务器的连接池工作器处于错误状态,Apache httpd 不会将任何请求转发到该服务器,直到超时时间到期。这使得能够关闭后端服务器以进行维护,并在以后将其重新联机。值为 0 表示始终重试处于错误状态的工作器,没有超时。
route - 在负载均衡器内使用时工作器的路由。路由是附加到会话 ID 的值。
status - 定义此工作器初始状态的单个字母值。
D: 工作器已禁用,不会接受任何请求。
S: 工作器已在管理上停止。
I: 工作器处于忽略错误模式,将始终被视为可用。
R: 工作器是热备。对于给定 lbset 中的每个不可用工作器(正在排空、已停止、处于错误状态等),将使用具有相同 lbset 的可用热备来代替它。热备可以帮助确保始终有特定数量的工作器可供均衡器使用。
H: 工作器处于热备模式,只有在均衡器集中没有其他可行工作器或备用工作器可用时才会使用。
E: 工作器处于错误状态。
N: 工作器处于排空模式,只接受为其自身而来的现有粘性会话,并忽略所有其他请求。
可以通过在前面加上 '+' 来设置状态(这是默认值),或者通过在前面加上 '-' 来清除状态。因此,'S-E' 设置将此工作器设置为已停止并清除错误标志。
timeout ProxyTimeout 套接字超时(以秒为单位)。Apache httpd 等待从后端发送/接收数据的秒数。
ttl - 非活动连接和关联的连接池条目生存时间(以秒为单位)。达到此限制后,连接将不再使用;它将在稍后关闭。
flusher flush

mod_proxy_fdpass 使用的提供程序的名称。有关更多详细信息,请参阅此模块的文档。

secret - mod_proxy_ajp 使用的密钥的值。它必须与 AJP 连接服务器端配置的密钥相同。
在 Apache HTTP Server 2.4.42 及更高版本中可用。
upgrade -

mod_proxy_httpmod_proxy_wstunnel 在 HTTP 客户端/浏览器协商后(根据 RFC 9110 - Upgrade)接受的协议。请参阅下面的 协议升级 说明

mapping -

pathurl 之间的映射类型。这决定了 mod_proxy 在匹配 path 之前将应用于请求的 uri-path 的规范化和/或(非)解码。如果映射匹配,它将提交到 uri-path,以便所有使用路径的目录上下文(如 <Location>)都将使用相同的映射进行匹配。

mapping=encoded 阻止 uri-path 的 %-解码,以便可以使用例如以下配置

ProxyPass "/special%3Fsegment" "https://example.com/special%3Fsegment" mapping=encoded
<Location "/special%3Fsegment">
  Require ip 172.17.2.0/24
</Location>

mapping=servlet 指的是 Servlet 规范定义的规范化,例如由 Apache Tomcat 用于 servlet 容器(特别是路径参数被忽略以进行映射)。然后,像 /some;foo/path 这样的 uri-path 将被映射为 /some/path,因此无论请求的路径参数如何,它都匹配以下任何一个

ProxyPass "/some/path" "https://servlet.example.com/some/path" mapping=servlet
<Location "/some/path">
  Require valid-user
</Location>

注意

建议在 Apache httpd 端使用与后端端使用的相同的映射。例如,当在 <Location> 块中为由 mod_proxy 映射到某些 servlet 容器(如在 Apache Tomcat 上运行的应用程序)的路径配置授权时,应使用 mapping=servlet 设置以防止路径参数等干扰要由 Apache httpd 强制执行的授权。

addressttl -1

后端地址的 DNS 解析缓存时间(以秒为单位)。-1 表示直到 Apache httpd 重新启动。

如果 Proxy 指令方案以 balancer:// 开头(例如:balancer://cluster,任何路径信息都会被忽略),那么将创建一个实际上不与后端服务器通信的虚拟工作器。相反,它负责管理多个“真实”工作器。在这种情况下,可以将特殊参数集添加到此虚拟工作器。有关均衡器工作原理的更多信息,请参阅 mod_proxy_balancer

均衡器参数
参数 默认值 描述
lbmethod byrequests 均衡器负载均衡方法。选择要使用的负载均衡调度程序方法。可以是 byrequests,执行加权请求计数;bytraffic,执行加权流量字节计数均衡;或 bybusyness,执行待处理请求均衡。默认值为 byrequests
maxattempts 比工作器数量少一个,或者只有一个工作器时为 1。 在放弃之前允许的最大故障转移尝试次数。
nofailover Off 如果设置为 On,如果工作器处于错误状态或已禁用,会话将断开。如果后端服务器不支持会话复制,请将此值设置为 On
stickysession - 均衡器粘性会话名称。该值通常设置为类似 JSESSIONIDPHPSESSIONID 的内容,它取决于支持会话的后端应用程序服务器。如果后端应用程序服务器对 cookie 和 URL 编码 ID 使用不同的名称(如 servlet 容器),请使用 | 将它们分隔开。第一部分用于 cookie,第二部分用于路径。
在 Apache HTTP Server 2.4.4 及更高版本中可用。
stickysessionsep "." 设置会话 cookie 中的分隔符。一些后端应用程序服务器不使用 '.' 作为符号。例如,Oracle Weblogic 服务器使用 '!'。可以使用此选项设置正确的符号。设置 'Off' 表示不使用任何符号。
scolonpathdelim Off 如果设置为 On,分号字符 ';' 将用作额外的粘性会话路径分隔符/分隔符。这主要用于在处理诸如 JSESSIONID=6736bcf34;foo=aabfa 之类的路径时模拟 mod_jk 的行为
timeout 0 均衡器超时(以秒为单位)。如果设置,这将是等待空闲工作器的最长时间。默认是不等待。
failonstatus - 单个或逗号分隔的 HTTP 状态代码列表。如果设置,当后端返回列表中的任何状态代码时,这将强制工作器进入错误状态。工作器恢复的行为与其他工作器错误相同。
failontimeout Off 如果设置,在将请求发送到后端后发生的 IO 读取超时将强制工作器进入错误状态。工作器恢复的行为与其他工作器错误相同。
在 Apache HTTP Server 2.4.5 及更高版本中可用。
nonce <auto> balancer-manager 应用程序页面中使用的保护性 nonce。默认情况下使用自动确定的基于 UUID 的 nonce,以提供对页面的进一步保护。如果设置,则 nonce 将设置为该值。设置 None 将禁用所有 nonce 检查。

注意

除了 nonce 之外,balancer-manager 页面还应通过 ACL 进行保护。

growth 0 除了配置中定义的 BalancerMember 之外,允许添加到此均衡器的额外 BalancerMember 数量。
forcerecovery On 如果均衡器的所有工作器都处于错误状态,则强制立即恢复所有工作器,而不考虑工作器的重试参数。可能存在以下情况:如果在不考虑每个工作器的重试参数的情况下强制执行所有工作器的恢复,则已经过载的后端可能会陷入更严重的问题。在这种情况下,设置为 Off
在 Apache HTTP Server 2.4.2 及更高版本中可用。

一个示例均衡器设置

ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On
<Proxy "balancer://mycluster">
    BalancerMember "ajp://1.2.3.4:8009"
    BalancerMember "ajp://1.2.3.5:8009" loadfactor=20
    # Less powerful server, don't send as many requests there,
    BalancerMember "ajp://1.2.3.6:8009" loadfactor=5
</Proxy>

配置热备可以帮助确保每个负载均衡器集始终有特定数量的工作器可用

ProxyPass "/" "balancer://sparecluster/"
<Proxy balancer://sparecluster>
    BalancerMember ajp://1.2.3.4:8009
    BalancerMember ajp://1.2.3.5:8009
    # The servers below are hot spares. For each server above that is unusable
    # (draining, stopped, unreachable, in error state, etc.), one of these spares
    # will be used in its place. Two servers will always be available for a request
    # unless one or more of the spares is also unusable.
    BalancerMember ajp://1.2.3.6:8009 status=+R
    BalancerMember ajp://1.2.3.7:8009 status=+R
</Proxy>

设置一个热备,只有在负载均衡器集中没有其他成员(或备用工作器)可用时才会使用

ProxyPass "/" "balancer://hotcluster/"
<Proxy "balancer://hotcluster">
    BalancerMember "ajp://1.2.3.4:8009" loadfactor=1
    BalancerMember "ajp://1.2.3.5:8009" loadfactor=2.25
    # The server below is on hot standby
    BalancerMember "ajp://1.2.3.6:8009" status=+H
    ProxySet lbmethod=bytraffic
</Proxy>

其他 ProxyPass 关键字

通常,mod_proxy 会规范化 ProxyPassed URL。但这可能与某些后端不兼容,特别是那些使用 PATH_INFO 的后端。可选的 nocanon 关键字会抑制此行为,并将 URL 路径“原始”地传递给后端。请注意,此关键字可能会影响后端的安全性,因为它会删除代理提供的针对基于 URL 的攻击的正常有限保护。

通常,mod_proxy 会在生成 SCRIPT_FILENAME 环境变量时包含查询字符串。可选的 noquery 关键字(在 httpd 2.4.1 及更高版本中可用)可以阻止这种情况。

可选的 interpolate 关键字与 ProxyPassInterpolateEnv 结合使用,会导致 ProxyPass 使用语法 ${VARNAME} 对环境变量进行插值。请注意,许多标准的 CGI 派生环境变量在进行此插值时将不存在,因此您可能仍然需要使用 mod_rewrite 来实现复杂的规则。另请注意,仅对于在解析指令时可用的变量(如 Define),插值才支持在 URL 的方案/主机名/端口部分中进行。可以使用 mod_rewrite 来动态确定这些字段。以下示例描述了如何使用 mod_rewrite 来动态设置方案为 http 或 https

RewriteEngine On

RewriteCond "%{HTTPS}" =off
RewriteRule "." "-" [E=protocol:http]
RewriteCond "%{HTTPS}" =on
RewriteRule "." "-" [E=protocol:https]

RewriteRule "^/mirror/foo/(.*)" "%{ENV:protocol}://backend.example.com/$1" [P]
ProxyPassReverse  "/mirror/foo/" "http://backend.example.com/"
ProxyPassReverse  "/mirror/foo/" "https://backend.example.com/"

协议升级

从 Apache HTTP Server 2.4.47 开始,mod_proxy_http 可以使用 ProxyPass 参数 upgrade 端到端地处理协议升级(隧道)。

端到端意味着来自客户端/浏览器的 HTTP 升级请求首先由 mod_proxy_http 转发到源服务器,并且只有在源服务器接受/启动升级(HTTP 响应 101 Switching Protocols)时,连接才会升级(并由 mod_proxy_http 隧道化)。如果源服务器以其他任何方式响应,mod_proxy_http 将继续像往常一样转发(并强制执行)此连接的 HTTP 协议。

有关使用 mod_proxy_http 的配置示例,请参见 Websocket 升级(2.4.47 及更高版本)

对于 Apache HTTP Server 2.4.46 及更早版本(或如果从 2.4.48 及更高版本开始的 ProxyWebsocketFallbackToProxyHttp 禁用了 mod_proxy_http 处理),请参见 mod_proxy_wstunnel 的文档,了解如何代理 WebSocket 协议。

top

ProxyPassInherit 指令

描述继承从主服务器定义的 ProxyPass 指令
语法ProxyPassInherit On|Off
默认值ProxyPassInherit On
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy
兼容性ProxyPassInherit 仅在 Apache HTTP Server 2.4.5 及更高版本中可用。

此指令将导致当前服务器/虚拟主机“继承”在主服务器中定义的 ProxyPass 指令。如果使用 Balancer Manager 进行动态更改,这可能会导致问题和不一致的行为,因此如果使用该功能,应禁用此指令。

全局服务器中的设置定义了所有虚拟主机的默认值。

禁用 ProxyPassInherit 也会禁用 BalancerInherit

top

ProxyPassInterpolateEnv 指令

描述在反向代理配置中启用环境变量插值
语法ProxyPassInterpolateEnv On|Off
默认值ProxyPassInterpolateEnv Off
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy
兼容性在 httpd 2.2.9 及更高版本中可用

此指令与 ProxyPassProxyPassReverseProxyPassReverseCookieDomainProxyPassReverseCookiePathinterpolate 参数一起使用,使反向代理能够使用环境变量进行动态配置,这些环境变量可能由其他模块(如 mod_rewrite)设置。它会影响 ProxyPassProxyPassReverseProxyPassReverseCookieDomainProxyPassReverseCookiePath 指令,并导致它们在配置指令中将环境变量 varname 的值替换为字符串 ${varname},前提是设置了 interpolate 选项。

ProxyPass 的方案/主机名/端口部分可能包含变量,但仅限于在解析指令时可用的变量(例如,使用 Define)。对于所有其他用例,请考虑使用 mod_rewrite

性能警告

除非您需要,否则请将其关闭!例如,将变量添加到 ProxyPass 中可能会导致使用配置的默认 mod_proxy 工作程序(这些工作程序不允许任何微调,例如连接重用等)。

top

ProxyPassMatch 指令

描述使用正则表达式将远程服务器映射到本地服务器 URL 空间
语法ProxyPassMatch [regex] !|url [key=value [key=value ...]]
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy
兼容性从 2.4.47 开始,当 url 参数包含反向引用时,会尊重 key=value 参数(参见下面的说明)。

此指令等效于 ProxyPass,但使用正则表达式而不是简单的前缀匹配。提供的正则表达式与 url 匹配,如果匹配,服务器将把任何带括号的匹配项替换到给定的字符串中,并将其用作新的 url

注意:此指令不能在 <Directory> 上下文中使用。

假设本地服务器的地址为 http://example.com/;那么

ProxyPassMatch "^/(.*\.gif)$" "http://backend.example.com/$1"

将导致对 http://example.com/foo/bar.gif 的本地请求在内部转换为对 http://backend.example.com/foo/bar.gif 的代理请求。

! 指令在您不想反向代理子目录的情况下很有用。

<LocationMatch> 部分中使用时,第一个参数被省略,正则表达式从 <LocationMatch> 获取。

如果您需要更灵活的反向代理配置,请参阅带有 [P] 标志的 RewriteRule 指令。

默认替换

当 URL 参数不使用任何对正则表达式的反向引用时,原始 URL 将附加到 URL 参数。

key=value 参数与带有反向引用的 url

从 Apache HTTP Server 2.4.47 开始,在使用带有反向引用的 urlProxyPassMatch 中,key=value 参数不再被忽略。但是,为了保持关于后端连接重用/保持活动状态的现有行为(以前从未为这些 URL 重用过),参数 enablereuse(或 disablereuse)在此情况下默认为 off(或 on)。显式设置 enablereuse=on 允许重用连接,**除非**某些反向引用属于 urlauthority 部分(主机名和/或端口)(此条件从 Apache HTTP Server 2.4.55 开始强制执行,并在启动时产生警告,因为这些 URL 本身不可重用)。

安全警告

在构建规则的目标 URL 时要小心,要考虑允许客户端影响服务器充当代理的 URL 集的安全影响。确保 URL 的方案和主机名部分是固定的,或者不允许客户端过度影响。

top

ProxyPassReverse 指令

描述调整从反向代理服务器发送的 HTTP 响应头中的 URL
语法ProxyPassReverse [path] url [interpolate]
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy

此指令允许 Apache httpd 调整 HTTP 重定向响应中的 LocationContent-LocationURI 头中的 URL。当 Apache httpd 用作反向代理(或网关)时,这至关重要,以避免由于位于反向代理后面的后端服务器上的 HTTP 重定向而绕过反向代理。

仅会重写上面提到的 HTTP 响应头。Apache httpd 不会重写其他响应头,也不会默认重写 HTML 页面内的 URL 引用。这意味着如果代理的内容包含绝对 URL 引用,它们将绕过代理。要重写 HTML 内容以匹配代理,您必须加载并启用 mod_proxy_html

path 是本地虚拟路径的名称;url 是远程服务器的部分 URL。这些参数的使用方式与 ProxyPass 指令相同。

例如,假设本地服务器的地址为 http://example.com/;然后

ProxyPass         "/mirror/foo/" "http://backend.example.com/"
ProxyPassReverse  "/mirror/foo/" "http://backend.example.com/"
ProxyPassReverseCookieDomain  "backend.example.com"  "public.example.com"
ProxyPassReverseCookiePath  "/"  "/mirror/foo/"

不仅会导致对 http://example.com/mirror/foo/bar 的本地请求在内部转换为对 http://backend.example.com/bar 的代理请求(ProxyPass 在这里提供的功能)。它还处理服务器 backend.example.com 在将 http://backend.example.com/bar 重定向到 http://backend.example.com/quux 时发送的重定向。Apache httpd 在将 HTTP 重定向响应转发到客户端之前,将其调整为 http://example.com/mirror/foo/quux。请注意,用于构建 URL 的主机名是根据 UseCanonicalName 指令的设置选择的。

请注意,此 ProxyPassReverse 指令也可以与 mod_rewrite 中的代理功能(RewriteRule ... [P])结合使用,因为它不依赖于相应的 ProxyPass 指令。

可选的 interpolate 关键字与 ProxyPassInterpolateEnv 结合使用,可以启用使用格式 ${VARNAME} 指定的环境变量的插值。请注意,插值不支持在 URL 的方案部分中进行。

<Location> 部分中使用时,第一个参数被省略,本地目录从 <Location> 获取。在 <LocationMatch> 部分中也会发生相同的情况,但可能无法按预期工作,因为 ProxyPassReverse 会将正则表达式逐字解释为路径;如果在这种情况下需要,请在部分外部或在单独的 <Location> 部分中指定 ProxyPassReverse。

此指令不支持在 <Directory><Files> 部分中使用。

top

ProxyPassReverseCookieDomain 指令

描述调整来自反向代理服务器的 Set-Cookie 头中的域字符串
语法ProxyPassReverseCookieDomain internal-domain public-domain [interpolate]
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy

用法与 ProxyPassReverse 基本类似,但不是重写作为 URL 的头,而是重写 Set-Cookie 头中的 domain 字符串。

top

ProxyPassReverseCookiePath 指令

描述调整来自反向代理服务器的 Set-Cookie 标头中的 Path 字符串
语法ProxyPassReverseCookiePath 内部路径 公共路径 [interpolate]
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy

ProxyPassReverse 结合使用时很有用,在后端 URL 路径映射到反向代理上的公共路径的情况下。此指令会重写 Set-Cookie 标头中的 path 字符串。如果 cookie 路径的开头与 内部路径 匹配,则 cookie 路径将被替换为 公共路径

ProxyPassReverse 中给出的示例中,指令

ProxyPassReverseCookiePath  "/"  "/mirror/foo/"

将把具有后端路径 /(或 /example,实际上,任何内容)的 cookie 重写为 /mirror/foo/

top

ProxyPreserveHost 指令

描述将传入的 Host HTTP 请求标头用于代理请求
语法ProxyPreserveHost On|Off
默认值ProxyPreserveHost Off
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy
兼容性在 2.3.3 及更高版本中,可在目录上下文中使用。

启用此选项后,它将把传入请求中的 Host: 行传递给代理主机,而不是 ProxyPass 行中指定的 hostname。

此选项通常应设置为 Off。它主要在特殊配置中很有用,例如代理的基于名称的大规模虚拟主机,其中后端服务器需要评估原始 Host 标头。

top

ProxyReceiveBufferSize 指令

描述代理的 HTTP 和 FTP 连接的网络缓冲区大小
语法ProxyReceiveBufferSize 字节
默认值ProxyReceiveBufferSize 0
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

ProxyReceiveBufferSize 指令指定代理的 HTTP 和 FTP 连接的显式(TCP/IP)网络缓冲区大小,以提高吞吐量。它必须大于 512 或设置为 0 以指示应使用系统的默认缓冲区大小。

示例

ProxyReceiveBufferSize 2048
top

ProxyRemote 指令

描述用于处理某些请求的远程代理
语法ProxyRemote 匹配 远程服务器 [用户名:密码]
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy
兼容性可选的第三个参数仅在 httpd 2.4.59 及更高版本中可用。

这定义了此代理的远程代理。 匹配 既可以是远程服务器支持的 URL 方案的名称,也可以是远程服务器应使用该服务器的 URL 部分,也可以是 * 以指示应联系该服务器以处理所有请求。 远程服务器 是远程服务器的 URL 部分。语法

远程服务器 = 方案://主机名[:端口]

方案 实际上是用于与远程服务器通信的协议;此模块仅支持 httphttps。使用 https 时,请求将使用 HTTP CONNECT 方法通过远程代理转发。

示例

ProxyRemote "http://goodguys.example.com/" "http://mirrorguys.example.com:8000"
ProxyRemote "*" "http://cleverproxy.localdomain"
ProxyRemote "ftp" "http://ftpproxy.mydomain:8080"

在最后一个示例中,代理将转发 FTP 请求,封装为另一个 HTTP 代理请求,转发到另一个可以处理它们的代理。

此选项还支持反向代理配置;后端 Web 服务器可以嵌入到虚拟主机 URL 空间中,即使该服务器被另一个转发代理隐藏。

可以提供可选的第三个参数 用户名:密码,它定义要传递给配置的远程代理的基本身份验证凭据。凭据将始终在不首先等待远程代理发送基本身份验证质询的情况下发送。如果使用此参数,则 Proxy-Chain-Auth 环境变量无效。

top

ProxyRemoteMatch 指令

描述用于处理由正则表达式匹配的请求的远程代理
语法ProxyRemoteMatch 正则表达式 远程服务器 [用户名:密码]
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy
兼容性可选的第三个参数仅在 httpd 2.4.59 及更高版本中可用。

ProxyRemoteMatchProxyRemote 指令相同,只是第一个参数是针对请求的 URL 的 正则表达式 匹配。

top

ProxyRequests 指令

描述启用转发(标准)代理请求
语法ProxyRequests On|Off
默认值ProxyRequests Off
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

这允许或阻止 Apache httpd 充当转发代理服务器。(将 ProxyRequests 设置为 Off 不会禁用 ProxyPass 指令的使用。)

在典型的反向代理或网关配置中,此选项应设置为 Off

为了获得代理 HTTP 或 FTP 站点的功能,您还需要在服务器中存在 mod_proxy_httpmod_proxy_ftp(或两者)。

为了获得(转发)代理 HTTPS 站点的功能,您需要在服务器中启用 mod_proxy_connect

警告

在您保护您的服务器之前,请勿使用 ProxyRequests 启用代理。开放代理服务器对您的网络和整个互联网都构成危险。

另请参见

top

ProxySet 指令

描述设置各种代理负载均衡器或成员参数
语法ProxySet url key=value [key=value ...]
上下文服务器配置、虚拟主机、目录
状态扩展
模块mod_proxy
兼容性ProxySet 仅在 Apache HTTP Server 2.2 及更高版本中可用。

此指令用作设置代理负载均衡器和工作程序可用的任何参数的替代方法,这些参数通常通过 ProxyPass 指令完成。如果在 <Proxy balancer url|worker url> 容器指令中使用,则不需要 url 参数。作为副作用,相应的负载均衡器或工作程序将被创建。这在通过 RewriteRule 而不是 ProxyPass 指令进行反向代理时可能很有用。

<Proxy "balancer://hotcluster">
    BalancerMember "http://www2.example.com:8080" loadfactor=1
    BalancerMember "http://www3.example.com:8080" loadfactor=2
    ProxySet lbmethod=bytraffic
</Proxy>
<Proxy "http://backend">
    ProxySet keepalive=On
</Proxy>
ProxySet "balancer://foo" lbmethod=bytraffic timeout=15
ProxySet "ajp://backend:7001" timeout=15

警告

请记住,相同的参数键可能具有不同的含义,具体取决于它是应用于负载均衡器还是工作程序,如上面关于超时的两个示例所示。

top

ProxySourceAddress 指令

描述设置传出代理连接的本地 IP 地址
语法ProxySourceAddress 地址
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy
兼容性在 2.3.9 及更高版本中可用

此指令允许设置一个特定的本地地址,以便在连接到后端服务器时绑定到该地址。

top

ProxyStatus 指令

描述在 mod_status 中显示代理负载均衡器状态
语法ProxyStatus Off|On|Full
默认值ProxyStatus Off
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy
兼容性在 2.2 及更高版本中可用

此指令确定是否通过 mod_status 服务器状态页面显示代理负载均衡器状态数据。

注意

FullOn 同义

top

ProxyTimeout 指令

描述代理请求的网络超时
语法ProxyTimeout
默认值Timeout 的值
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

此指令允许用户在代理请求上指定超时。当您有一个缓慢/有错误的应用程序服务器挂起时,这很有用,您宁愿返回超时并优雅地失败,而不是等待服务器返回所需的时间。

top

ProxyVia 指令

描述在代理请求的 Via HTTP 响应标头中提供的信息
语法ProxyVia On|Off|Full|Block
默认值ProxyVia Off
上下文服务器配置,虚拟主机
状态扩展
模块mod_proxy

此指令控制代理使用 Via: HTTP 标头。它的预期用途是控制代理请求在一系列代理服务器中的流动。有关 Via: 标头行的说明,请参见 RFC 2616(HTTP/1.1),第 14.45 节。

可用语言:  en  |  fr  |  ja 

top

评论

注意
这不是问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果它们被实施或被认为无效/偏离主题,则可能被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应直接发送到我们的 IRC 频道 #httpd(在 Libera.chat 上),或发送到我们的 邮件列表