(一).ProxyPass 指令
说明 将一个远端服务器映射到本地服务器的URL空间中
语法 ProxyPass [path] !|url [key=value key=value ...]]
作用域 server config, virtual host, directory
状态 扩展(E)
模块 mod_proxy
该指令允许你将一个远端服务器映射到本地服务器的URL空间中,此时本地服务器并不充当代理角色,而是充当远程服务器的一个镜像。path是一个本地虚拟路径名,url是一个指向远程服务器的部分URL,并且不允许包含查询字符串。
当使用ProxyPass指令时,ProxyRequests指令通常应当被设为 off 。
保证以下模块加载
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
配置ProxyPass
假设本地服务器地址是:http://example.com/ ,那么,
ProxyPass /mirror/foo/ http://backend.example.com/
将会导致对http://example.com/mirror/foo/bar的本地请求将会在内部转换为一个代理请求:http://backend.example.com/bar 。
"!"指令对于您不想对某个子目录进行反向代理时很有用。比如说:
ProxyPass /mirror/foo/i !
ProxyPass /mirror/foo http://backend.example.com
将会代理除/mirror/foo/i之外的所有对backend.example.com下/mirror/foo的请求。
注意
顺序很重要,您需要把拒绝指令放置在普通ProxyPass指令之前。
(二).ProxyPassReverse 指令
说明: 调整由反向代理服务器发送的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指令中的使用方法相同。
例如使用apache作为域名www.test.com代理服务器,让其暴露在公网上,即DNS解析到本机器上,真正提供web服务器的是另一台位于同一内网的机器上,假设起IP是192.168.100.22,那么只需要如下配置就可以了。
ProxyPass / http://192.168.100.22/
ProxyPassReverse / http://192.168.100.22/
ProxyPass 很好理解,就是把所有来自客户端对http://www.test.com的请求转发给http://192.168.100.22上进行处理,ProxyPassReverse 的配置总是和ProxyPass 一致,但用途很让人费解。似乎去掉它很能很好的工作,事实真的是这样么,其实不然,如果响应中有302重定向,ProxyPassReverse就派上用场。
举例说明,假设用户访问http://www.test.com/exam.php,通过转发交给http://192.168.100.22/exam.php处理,假定exam.php处理的结果是实现redirect到login.php(使用相对路径,即省略了域名信息),如果没有配置反向代理,客户端收到的请求响应是重定向操作,并且重定向目的url为http://192.168.100.22/login.php ,而这个地址只是代理服务器能访问到的,可想而知,客户端肯定是打不开的,反之如果配置了反向代理,则会在转交HTTP重定向应答到客户端之前调整它为http://www.test.com/login.php,即是在原请求之后追加上了redirect的路径。当客户端再次请求http://www.test.com/login.php,代理服务器再次工作把其转发到http://192.168.100.22/login.php。
客户端到服务器称之为正向代理,那服务器到客户端就叫反向代理。
应用举例:
<VirtualHost *:80> ProxyRequests Off ServerName www.test.com:80 ServerAlias ProxyPass / http://192.168.100.13:8080/ ProxyPassReverse / http://192.168.100.13:8080/ </VirtualHost>