写在前面
之前介绍了JSONP的跨域方式,那是利用前端方案解决跨域问题。跨域问题也可以用后端方案解决,比如CORS(Cross-Origin-Resource-Shares)、方向代理等。今天介绍下反向代理如何解决跨域问题。
Apache和Nginx都可以实现反向代理,下面分别介绍下Apache和Nginx如何通过反向代理解决跨域问题。
Apache
Apache mod_proxy模块实现了代理/网关的功能,他实现了以下协议的代理-FTP、CONNECT(用于SSL)、HTTP0.9、HTTP1.0、HTTP1.1。此模块经过配置后可以通过以上协议或其它协议连接其它代理模块。
1、安装Apache Proxy_Http Server
vi /path/to/http.conf
//去调下面俩行的注释(#)
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
2、配置转发规则
ProxyRequests Off
proxy_pass /api http://127.0.0.1:8602;
ProxyPassReverse /api http://127.0.0.1:8602;
proxy_set_header Host "192.168.60.31:8602";
proxy_set_header X-Forwarded-For $remote_addr;
将api开头的请求转发到端口8602的端口服务上。
ProxyRequests Off 指令是指开启反向代理,对于客户端来说,他就是原始服务器,并且客户端不用进行特别的设置;而正向代理允许客户端通过它访问任何服务并隐藏客户端自身,因此必须采取一些安全措施确保只为授权的服务器提供服务;
ProxyPass 将一个远端服务器映射到本地服务器的URL空间中;
ProxyPassReverse 调整由反向代理服务器发送的HTTP回应头中的URL;
Proxy_set_header 是向反向代理服务器后端服务器发起请求时添加header信息,当请求的服务器有多个host时,可以通过Host选项区分。
理解正向代理与方向代理:
正向代理:
“反向代理(Reverse Proxy)是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 请求连接的客户端,此时,代理服务器对外就表现为一个服务器。”——《实战Nginx》
正向代理
正向代理(Forward Proxy),通常都被简称为代理,就是在用户无法正常访问外部资源,比方说受到GFW的影响无法访问twitter的时候,我们可以通过代理的方式,让用户绕过防火墙,从而连接到目标网络或者服务。
Nginx
Nginx也可以通过设置proxy_pass来实现反向代理。配置如下:
location /dir {
proxy_pass http://127.0.0.1/api;
}
反向代理的优势
请求的统一控制,包括设置权限、过滤规则等;
隐藏内部服务真实地址,暴露在外的只是反向代理服务器地址;
实现负载均衡,内部可以采用多台服务器来组成服务器集群,外部还是可以采用一个地址访问;
解决Ajax跨域问题;
作为真实服务器的缓冲,解决瞬间负载量大的问题。