Apache HTTP服务器 2.0版本
说明: | 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>
说明: | Ports that are allowed to CONNECT through the proxy |
---|---|
语法: | AllowCONNECT port [port] ... |
默认值: | AllowCONNECT 443 563 |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
The AllowCONNECT
directive specifies a list
of port numbers to which the proxy CONNECT
method may
connect. Today's browsers use this method when a https
connection is requested and proxy tunneling over http is in
effect.
By default, only the default https port (443) and the
default snews port (563) are enabled. Use the
AllowCONNECT
directive to overrride this default and
allow connections to the listed ports only.
说明: | Hosts, domains, or networks that will be connected to directly |
---|---|
语法: | NoProxy host [host] ... |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
This directive is only useful for Apache proxy servers within
intranets. The NoProxy
directive specifies a
list of subnets, IP addresses, hosts and/or domains, separated by
spaces. A request to a host which matches one or more of these is
always served directly, without forwarding to the configured
ProxyRemote
proxy server(s).
ProxyRemote * http://firewall.mycompany.com:81
NoProxy .mycompany.com 192.168.112.0/21
The host arguments to the NoProxy directive are one of the following type list:
.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
or 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>
说明: | Words, hosts, or domains that are banned from being proxied |
---|---|
语法: | ProxyBlock *|word|host|domain
[word|host|domain] ... |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
The ProxyBlock
directive specifies a list of
words, hosts and/or domains, separated by spaces. HTTP, HTTPS, and
FTP document requests to sites whose names contain matched words,
hosts or domains are blocked by the proxy server. The proxy
module will also attempt to determine IP addresses of list items which
may be hostnames during startup, and cache them for match test as
well. Example:
ProxyBlock joes-garage.com some-host.co.uk rocky.wotsamattau.edu
'rocky.wotsamattau.edu' would also be matched if referenced by IP address.
Note that 'wotsamattau' would also be sufficient to match 'wotsamattau.edu'.
Note also that
ProxyBlock *
blocks connections to all sites.
说明: | Default domain name for proxied requests |
---|---|
语法: | ProxyDomain Domain |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
This directive is only useful for Apache proxy servers within
intranets. The ProxyDomain
directive specifies
the default domain which the apache proxy server will belong to. If a
request to a host without a domain name is encountered, a redirection
response to the same host with the configured Domain appended
will be generated.
ProxyRemote * http://firewall.mycompany.com:81
NoProxy .mycompany.com 192.168.112.0/21
ProxyDomain .mycompany.com
说明: | Override error pages for proxied content |
---|---|
语法: | ProxyErrorOverride On|Off |
默认值: | ProxyErrorOverride Off |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
兼容性: | Available in version 2.0 and later |
This directive is useful for reverse-proxy setups, where you want to have a common look and feel on the error pages seen by the end user. This also allows for included files (via mod_include's SSI) to get the error code and act accordingly (default behavior would display the error page of the proxied server, turning this on shows the SSI Error message).
说明: | IO buffer size for outgoing HTTP and FTP connections |
---|---|
语法: | ProxyIOBufferSize bytes |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
说明: | 施用于匹配正则表达式的代理资源的指令 |
---|---|
语法: | <ProxyMatch regex> ...</ProxyMatch> |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
<ProxyMatch>
与<Proxy>
指令基本相同,只是匹配字串可以为正则表达式。
说明: | Maximium number of proxies that a request can be forwarded through |
---|---|
语法: | ProxyMaxForwards number |
默认值: | ProxyMaxForwards 10 |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
兼容性: | Available in Apache 2.0 and later |
The ProxyMaxForwards
directive specifies the
maximum number of proxies through which a request may pass. This is
set to prevent infinite proxy loops, or a DoS attack.
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。
HTTP redirect responses. This is essential when Apache is used as
a reverse proxy to avoid by-passing the reverse proxy because of HTTP
redirects on the backend servers which stay behind the reverse proxy.
路径是本地虚拟路径的名称。
url远端服务器的部分URL。与ProxyPass
指令中的使用方法相同。
示例:
假定本地服务器拥有地址http://wibble.org/
;那么
ProxyPass /mirror/foo/ http://foo.com/
ProxyPassReverse /mirror/foo/ http://foo.com/
will not only cause a local request for the
<http://wibble.org/mirror/foo/bar
> to be internally
converted into a proxy request to <http://foo.com/bar
> (the
functionality ProxyPass
provides here). It also takes care of
redirects the server foo.com sends: when http://foo.com/bar
is
redirected by him to http://foo.com/quux
Apache adjusts this to
http://wibble.org/mirror/foo/quux
before forwarding the HTTP
redirect response to the client. Note that the hostname used for
constructing the URL is chosen in respect to the setting of the
UseCanonicalName
directive.
Note that this ProxyPassReverse
directive can
also be used in conjunction with the proxy pass-through feature
("RewriteRule ... [P]
") from
mod_rewrite
because its doesn't depend on a
corresponding ProxyPass
directive.
When used inside a <Location>
section, the first argument is
ommitted and the local directory is obtained from the <Location>
.
说明: | 使用发来的HTTP请求头来发送代理请求 |
---|---|
语法: | ProxyPreserveHost on|off |
默认值: | ProxyPreserveHost Off |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
兼容性: | 存在于Apache 2.0.31及其后继版本中 |
当启用时,此选项将把传入请求的Host:行传递给被代理的主机,而不是传递在proxypass行中指定的主机名。
此选项一般为禁用状态。
说明: | Network buffer size for outgoing HTTP and FTP connections |
---|---|
语法: | ProxyReceiveBufferSize bytes |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
The ProxyReceiveBufferSize
directive
specifies an explicit network buffer size for outgoing HTTP and FTP
connections, for increased throughput. It has to be greater than 512
or set to 0 to indicate that the system's default buffer size should
be used.
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'。
在没能确保您服务器的安全之前不要启用代理。开放代理服务器不仅对您的网络有威胁,对整个因特网来说也同样如此。
说明: | Network timeout for proxied requests |
---|---|
语法: | ProxyTimeout seconds |
默认值: | ProxyTimeout 300 |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
兼容性: | Available in Apache 2.0.31 and later |
This directive allows a user to specifiy a timeout on proxy requests. This is usefull when you have a slow/buggy appserver which hangs, and you would rather just return a timeout and fail gracefully instead of waiting however long it takes the server to return
说明: | Information provided in the Via HTTP response header for proxied requests |
---|---|
语法: | ProxyVia on|off|full|block |
默认值: | ProxyVia off |
上下文: | 服务器配置, 虚拟主机 |
状态: | Extension |
模块: | mod_proxy |
This directive controls the use of the Via:
HTTP
header by the proxy. Its intended use is to control the flow of of
proxy requests along a chain of proxy servers. See RFC2068 (HTTP/1.1)
for an explanation of Via:
header lines.
Via:
header,
it is passed through unchanged.Via:
header line added for
the current host.Via:
header
line will additionally have the Apache server version shown as a
Via:
comment field.Via:
header lines
removed. No new Via:
header will be generated.