Apache HTTP服务器 2.0版本
现有的语种: en
说明: | HTTP/1.1 代理/网关服务器 |
---|---|
状态: | Extension |
模块名: | proxy_module |
源文件: | mod_proxy.c |
此模块实现了Apache的代理/网关。它实现了以下规范的代理
FTP
,
CONNECT
(用于SSL),
HTTP/0.9
,
HTTP/1.0
,和
HTTP/1.1
。
此模块经配置后可用上述或其它协议连接其它代理模块。
此模块在Apache 1.1.x中处于试验阶段,而在Apache v1.2.x和Apache v1.3.x中进行了改良并去除了一些bug。然后在Apache v2.0中进行了大的修整。现在协议的支持已经升级到HTTP/1.1,并支持了过滤器。
请注意:截止至Apache v1.3.x的mod_proxy的缓冲功能已经从mod_proxy中移除并入了一个新模块——mod_cache。换句话说:Apache 2.0.x的Proxy不再支持缓冲了——所有的缓冲功能已经移入了mod_cache。mod_cache现在已经能支持任何内容的缓冲了,而不仅是通过代理的内容。
如果您需要使用SSL来联系远端服务器,您最好查阅一下mod_ssl
中的SSLProxy*
指令。
在您没有对您的服务器采取安全措施之前,请不要用ProxyRequests
启用您的代理。一个开放的代理服务器不仅对您的网络有威胁,对整个因特网来说也同样如此。
Apache可以配置成为正向和反向代理。
正向代理是一个能使您的浏览器连接一个平时无法访问的远端网络的媒介。一个正向代理也能用于缓冲数据,以降低正向代理和远端web服务器之间的负载。
Apache的mod_proxy在使用ProxyRemote
指令时,可以看作是一个正向代理。另外,数据缓冲的功能可以靠配置mod_cache
来完成。其它提供正向代理的软件还包括Squid。
反向代理是一个web服务器系统。除了为客户端提供位于本地磁盘上的页面或是由CGI动态生成的页面之外,它还能为客户端提供位于其它web服务器上的web页面,从而使这些页面看起来像是存在于这个代理服务器上一样。
当使用了mod_cache配置一个反向代理后,它可以作为一个比较慢的web服务器的缓冲来使用。反向代理也可以启用高级URL策略和管理技术,从而使处于不同web服务器系统或是体系的web页面同时存在于同一个URL空间下。反向代理对于实现具有很多或不同的web站点后端的集中管理非常理想。复杂的多层服务器系统可以使用一个Apache的mod_proxy前端和任意数量的后端web服务器来进行架构。
反向代理使用ProxyPass
和ProxyPassReverse
指令进行配置。可以使用mod_cache和正向代理结合启用缓冲功能。
您可以通过<Proxy>
的阻止功能来控制谁能访问您的代理。示例如下:
<Proxy *>
Order Deny,Allow
Deny from all
Allow from 192.168.0
</Proxy>
当配置为反向代理时,访问控制由普通服务器的<directory>
配置实现。
您可能没有在您的代理mime类型配置文件中定义特定的文件类型 application/octet-stream。有用的一行可以是这样的:
application/octet-stream bin dms lha lzh exe class tgz taz
在很罕见的情况下,也许您想要用FTP的ASCII传输方法来下载某个特定文件(默认的传输是binary模式),您可以用在请求前面加上;type=a
前缀的方式覆盖mod_proxy的默认值来强制进行ASCII模式的传输。(不论如何,FTP目录列表将始终以ASCII模式执行。)
一个FTP URI一般被当成登录用户home目录的相对路径处理。唉,但您不能使用/../来到达更上层的目录层次,因为点(.)由浏览器解释而不会真正发送给FTP服务器。为搞定这个问题,在Apache FTP代理中实现了一个"Squid %2f hack"。这是一个也被其它流行的类似Squid Proxy Cache的代理服务器使用的解决方法。使用预先将/%2f加入您请求路径的方法,您能使代理将FTP起始目录改为 / (而不是home目录)。
举例说:为了取得文件/etc/motd
,您应当使用下面这样的URL:
ftp://user@host/%2f/etc/motd
使用用户名和密码登入一个FTP服务器时,Apache使用了不同的策略。当URL中不存在用户名和密码时,Apache会向FTP服务器发出一个匿名用户的登录,比如说:
user: anonymous
password: apache_proxy@
这对于配置了匿名访问的大多数FTP服务器来说是很有效的。
为了以特定的用户名登录,您可以将用户名嵌入URL里面,就好像下面这样:ftp://username@host/myfile
。如果在给出了这个用户名后,FTP服务器要求提供一个密码(这是它应该做的),这时Apache会回应一个[401 Authorization required]。这将会使浏览器弹出一个username/password对话框。当输入了密码后,将会再次尝试连接,如果成功,则请求的资源就会下载下来。这种方法的好处在于您的浏览器不会以明码的形式显示密码(当您使用ftp://username:password@host/myfile
的时候就无法做到这一点)。
如果您使用了ProxyBlock
指令,将会在启动时查找并缓存主机名的IP地址以备后继的匹配测试使用。这将会花费几秒(或更长)的时间,这主要取决于主机名查找的速度。
一个位于局域网内的Apache代理服务器需要经由公司的防火墙转发对外部的请求.但当它访问局域网内的资源时,它能越过防火墙直接访问目的主机。在访问一个属于局域网的服务器从而进行直接连接时,NoProxy
指令就会很有用。
局域网内的用户习惯于不在他们的WWW请求中加入本地域的名称,于是会使用"http://somehost/"来取代"http://somehost.my.dom.ain/"。一些商业代理服务器会不管这些,只是采用本地域的配置来简单的伺服这个请求。当使用了ProxyDomain
指令来为服务器配置了一个代理服务时,Apache会发出一个重定向回应,以使客户端请求到达正确的、能满足要求的服务器地址。因为这样一来,用户的书签文件就会随之包含完整的主机名,所以这是首选的方法。
在您有一个应用服务器没有正常实现连接保持或HTTP/1.1的情况下,您可以设置两个环境变量来发送一个不带连接保持的HTTP/1.0。这两个变量是通过SetEnv
指令设置的。
以下是'force-proxy-request-1.0'和'proxy-nokeepalive'的例子。
<location /buggyappserver/ >
ProxyPass http://buggyappserver:7001/foo/
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
</location>
说明: | 通过代理允许CONNECT的端口号 |
---|---|
语法: | AllowCONNECT 端口号 [端口号] ... |
默认值: | AllowCONNECT 443 563 |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
AllowCONNECT
指令指定了此代理的CONNECT
方法可以连接的端口号列表。当今的浏览器在进行https连接请求时使用这种方法,而代理默认会将其转为http。在默认情况下,只启用了默认的https端口(443)和默认的snews端口(563)。使用AllowCONNECT
指令来覆盖默认设置而改为仅允许连接列出的端口。
说明: | 将直接进行连接的主机、域或网络 |
---|---|
语法: | NoProxy 主机 [主机] ... |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
此指令仅适用于局域网内的Apache代理服务器。NoProxy
指令指定了一个中间以空格分隔的子网、IP地址、主机和/或域的列表。对某个匹配上述一个或多个列表项的主机的请求将直接被其伺服而不会前转到配置好的ProxyRemote
代理服务器。
ProxyRemote * http://firewall.mycompany.com:81
NoProxy .mycompany.com 192.168.112.0/21
NoProxy指令的主机参数可以为以下选项之一:
.com
.apache.org.
.MyDomain.com
and
.mydomain.com.
(note the trailing period) are
considered equal. Since a domain comparison does not involve a DNS
lookup, it is much more efficient than subnet comparison.192.168
或192.168.0.0
255.255.0.0
)192.168.112.0/21
192.168.112.0/21
with a netmask of 21
valid bits (also used in the form 255.255.248.0)prep.ai.mit.edu
www.apache.org.
WWW.MyDomain.com
and www.mydomain.com.
(note the trailing period) are
considered equal.说明: | 施用于代理资源的指令的容器 |
---|---|
语法: | <Proxy 包含通配符的URL> ...</Proxy> |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
位于<Proxy>
配置段中的指令仅施用于匹配的代理内容。语句中可以使用shell风格的通配符。
比如说:下例将仅允许yournetwork.example.com
中的主机通
过您的代理服务器访问代理内容:
<Proxy *>
Order Deny,Allow
Deny from all
Allow from yournetwork.example.com
</Proxy>
下例将在所有example.com
的foo
目录下的文件通过代理服务器发送之前用INCLUDES
过滤器进行处理:
<Proxy http://example.com/foo/*>
SetOutputFilter INCLUDES
</Proxy>
说明: | 设置被代理屏蔽的语句、主机、和域 |
---|---|
语法: | ProxyBlock *|语句|主机|域
[语句|主机|域] ... |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
ProxyBlock
指令指定了一个由空格分隔的语句、主机和/或域的列表。所有对匹配这些语句、主机和/或域的站点的HTTP、HTTPS和FTP文档的请求都将被代理服务器阻断。代理模块亦会在启动时尝试确定列表中可能是主机名的项目对应的IP地址,并将其缓冲用于匹配测试。比如说:
ProxyBlock joes-garage.com some-host.co.uk rocky.wotsamattau.edu
“rocky.wotsamattau.edu”将由于IP地址同样被匹配。
请注意“wotsamattau”已经足够匹配“wotsamattau.edu”了。
请注意
ProxyBlock *
将屏蔽所有站点的连接。
说明: | 代理请求的默认域名 |
---|---|
语法: | ProxyDomain 域 |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
此指令仅对位于局域网内的Apache代理服务器有用。ProxyDomain
指令指定了apache代理服务器归属的默认域。如果遇到了一个对没有域名的主机的请求,就会自动生成一个对根据配置加上了域的同一主机的重定向回应。
ProxyRemote * http://firewall.mycompany.com:81
NoProxy .mycompany.com 192.168.112.0/21
ProxyDomain .mycompany.com
说明: | 覆盖代理内容的错误页 |
---|---|
语法: | ProxyErrorOverride On|Off |
默认值: | ProxyErrorOverride Off |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
兼容性: | 存在于Apache 2.0及其后继版本 |
此指令用于反向代理设置中您想为最终用户提供观感一致的错误页面时。它也同样允许包含文件(通过 mod_include 的SSI)获取错误号并作出相应行动。(默认行为是显示被代理的服务器的错误页面,将此项目设为on将显示SSI错误信息)。
说明: | 用于外向HTTP和FTP连接的IO缓冲大小 |
---|---|
语法: | ProxyIOBufferSize 字节数 |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
说明: | 施用于匹配正则表达式的代理资源的指令 |
---|---|
语法: | <ProxyMatch regex> ...</ProxyMatch> |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
<ProxyMatch>
与<Proxy>
指令基本相同,只是匹配字串可以为正则表达式。
说明: | 能够同时进行前转的代理请求的最大数目 |
---|---|
语法: | ProxyMaxForwards 数值 |
默认值: | ProxyMaxForwards 10 |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
兼容性: | 存在于Apache 2.0及其后继版本 |
ProxyMaxForwards
指令指定了同时进行前转的代理请求的最大数目。这个设置是为了避免无限代理循环或DoS攻击的发生。
ProxyMaxForwards 10
说明: | 将一个远端服务器映射到本地服务器的URL空间中 |
---|---|
语法: | ProxyPass [路径] !|url |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
指令对于您不想对某个子目录进行反向代理时很有用。比如说:
ProxyPass /mirror/foo/i !
ProxyPass /mirror/foo http://foo.com
将会代理除对/mirror/foo/i请求之外的所有对 foo.com 的/mirror/foo请求。
当在<Location>
配置段中使用时,第一个参数会被忽略而是采用由<Location>
指令指定的本地目录。
如果您需要一个更加灵活的反向代理配置,请参见使用[P]
标记的RewriteRule
指令。
说明: | 调整由反向代理服务器发送的HTTP回应头中的URL |
---|---|
语法: | ProxyPassReverse [路径] url |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
此指令使 Apache 调整HTTP重定向回应中Location
,Content-Location
和URI
头里的URL。这就是Apache在作为反向代理使用时,避免以因为位于反向代理之后的后端服务器的HTTP重定向造成的绕过反向代理的实质。
路径是本地虚拟路径的名称。
url远端服务器的部分URL。与ProxyPass
指令中的使用方法相同。
示例:
假定本地服务器拥有地址http://wibble.org/
;那么
ProxyPass /mirror/foo/ http://foo.com/
ProxyPassReverse /mirror/foo/ http://foo.com/
不仅会把所有对<http://wibble.org/mirror/foo/bar
>的请求直接转为对 <http://foo.com/bar
> 的代理请求,(由ProxyPass
提供的功能)。它还会改变服务器foo.com的发送:当http://foo.com/bar
被它重定向到http://foo.com/quux
时,Apache会在前转HTTP重定向回应到客户端之前调整它为http://wibble.org/mirror/foo/quux
。请注意:被选做用于构建URL的主机名与UseCanonicalName
指令的设置有关。
请注意,此ProxyPassReverse
指令亦可与mod_rewrite
的代理穿透特性("RewriteRule ...[P]
")联用。因为它不依赖于相应的ProxyPass
指令。
当在<Location>
配置段中使用时,第一个参数会被忽略而是采用由<Location>
指令指定的本地目录。
说明: | 使用发来的HTTP请求头来发送代理请求 |
---|---|
语法: | ProxyPreserveHost on|off |
默认值: | ProxyPreserveHost Off |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
兼容性: | 存在于Apache 2.0.31及其后继版本中 |
当启用时,此选项将把传入请求的Host:行传递给被代理的主机,而不是传递在proxypass行中指定的主机名。
此选项一般为禁用状态。
说明: | 对向外的HTTP和FTP连接使用的网络缓冲大小 |
---|---|
语法: | ProxyReceiveBufferSize 字节数 |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
ProxyReceiveBufferSize
指令为增加的吞吐量指定了一个明确的向外的HTTP和FTP连接的网络缓冲大小。这个值必须大于512,或设置为0代表使用系统默认的缓冲大小。
ProxyReceiveBufferSize 2048
说明: | 用户处理某些特定请求的远端代理 |
---|---|
语法: | ProxyRemote match remote-server |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
此指令定义了此代理的远端代理。match可以是远端服务器支持的URL形式的名称,或是远端服务器使用的部分URL,或是'*'以代表服务器可以接受所有的请求。remote-server是远端服务器的部分URL。语法为:
remote-server = protocol://hostname[:port]
protocol是与远端服务器交换信息时使用的协议;本模块暂时只支持"http"。
举例如下:
ProxyRemote http://goodguys.com/ http://mirrorguys.com:8000
ProxyRemote * http://cleversite.com
ProxyRemote ftp http://ftpproxy.mydomain.com:8080
在最后一个例子中,代理会将封装到另外一个HTTP代理请求中的FTP请求前转到另外一个能处理它们的代理去。
此选项也支持反向代理配置 - 一个后端web服务器可以被嵌入到一个虚拟主机的URL空间中,哪怕它是由另一个代理前转过来的。
说明: | 处理匹配正则表达式的远端代理 |
---|---|
语法: | ProxyRemoteMatch regex remote-server |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
ProxyRemoteMatch
与ProxyRemote
指令基本相同。除了第一个参数是由一个请求的URL变成了匹配的正则表达式。
说明: | 启用前转(基本)代理请求 |
---|---|
语法: | ProxyRequests on|off |
默认值: | ProxyRequests Off |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
此指令将允许或禁止Apache作为前转代理服务器的功能。(将ProxyRequests设置为'off'并不会禁用ProxyPass
指令。)
在一个典型的反向代理配置中,此可选项一般设置为'off'。
在没能确保您服务器的安全之前不要启用代理。开放代理服务器不仅对您的网络有威胁,对整个因特网来说也同样如此。
说明: | 对代理请求的网络超时设置 |
---|---|
语法: | ProxyTimeout seconds |
默认值: | ProxyTimeout 300 |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
兼容性: | 存在于Apache 2.0及其后继版本 |
此指令允许用户对代理请求指定一个超时值。当你有一个很慢/错误多多的应用服务器经常挂起,而您宁愿返回一个超时的失败信息也不愿意继续等待不知道多久的时候,这个功能是很有用的。
说明: | 对被代理请求的ViaHTTP回应头中提供的信息 |
---|---|
语法: | ProxyVia on|off|full|block |
默认值: | ProxyVia off |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
此指令控制了代理对于Via:
HTTP头的使用。它的使用目的是控制位于一个代理服务器链中的代理请求的流向。参阅 RFC2068 (HTTP/1.1)获得关于Via:
头部分的解释。
Via:
头,它将不进行任何修改的通过。Via:
头。Via:
头行中都会额外加入Apache服务器的版本,以Via:
注释域出现。Via:
头行都将被移除。且不会产生新的Via:
头。现有的语种: en