【apache】mod_proxy 和 mod_rewrite实现js跨域
2013-05-27 13:12
330 查看
项目中用到了,于是搞了几多时间,还是没太明白,只是会基本用法,由于后来项目换实现方式,不存在跨域问题了,就没研究了,这里记录下,已备所需
废话不多说了,这里只讲这个,其他方式自己去试,直接先上两篇参考
1、(两种方式的基本配置)
由于前端解决跨域问题的局限性比较大,对于 Ajax 跨域或是 iframe 跨域,建议用服务器端解决方案。
此方案的原理是接受客户端发来的请求后,经由本域服务器代理向目标服务器发送请求,并将响应数据返回给客户端。
用 apache 的 mod_proxy 模块开启反向代理功能来实现:
1 修改 apache 配置文件 httpd.conf ,去掉以下两行前面 # 号
废话不多说了,这里只讲这个,其他方式自己去试,直接先上两篇参考
1、(两种方式的基本配置)
由于前端解决跨域问题的局限性比较大,对于 Ajax 跨域或是 iframe 跨域,建议用服务器端解决方案。
此方案的原理是接受客户端发来的请求后,经由本域服务器代理向目标服务器发送请求,并将响应数据返回给客户端。
用 apache 的 mod_proxy 模块开启反向代理功能来实现:
1 修改 apache 配置文件 httpd.conf ,去掉以下两行前面 # 号
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so2 在 server config 或 virtual host 中增加:
ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass /folder http://****.com/floder[/code]重启 apache.
注释:ProxyRequests Off指令是指采用反向(reverse)代理,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置;而正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为经过授权的客户端提供服务。ProxyPass指令允许将一个远端服务器映射到本地服务器的 URL 空间中,此时本地服务器并不充当代理角色,而是充当远程服务器的一个镜像。/folder 是一个本地虚拟路径,http://****.com/floder 是一个指向远程服务器的部分 URL
如果不想对某个子目录进行反向代理时,可以用"!"指令。比如说:ProxyPass /folder/exception ! ProxyPass /folder http://****.com/floder[/code]将会代理除 /folder/exception 之外的所有对 http://****.com/floder 的请求。
也可以用 URL 重写的方法来实现
1 修改 apache 配置文件 httpd.conf ,去掉以下三行前面 # 号LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so2 在 server config 或 virtual host 中增加:
LoadModule rewrite_module modules/mod_rewrite.so<Location /folder> SetHandler proxy-server order allow,deny Allow from all </Location> RewriteEngine on RewriteRule ^/folder/(.*)$ http://****.com/floder [L,R=301,P,NC]注释:Location指令提供了基于URL的访问控制,对于本域下的 /folder 目录下的任何资源的访问都会首先由proxy-server这个 handler(mod_proxy模块内部定义的一个 handler)来处理。SetHandler proxy-server指令是强制所有匹配的文件被一个代理服务器处理。RewriteEngine on指令是指打开重写引擎。RewriteRule指令是重写规则。last|L这个标记用于阻止当前已被重写的 URL 被后继规则再次重写。redirect|R [=code]若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个外部重定向,是跨域或定向到外部域的必备良药。默认为 HTTP 响应码为 302, 我通常指定为301。proxy|P此标记使替换成分被内部地强制作为代理请求发送,表明该 rewrite 是通过 mod_proxy 代理过去,而不是通过外部重定向过去。nocase|NC忽略大小写,也就是在Pattern与当前 URL 匹配时,’A-Z’和’a-z’没有区别。
2、(mod_rewrite官方文档中文详解) http://man.chinaunix.net/newsoft/ApacheManual/misc/rewriteguide.html
下面是我根据上面2篇参考自己写的:
1、下载apache代理服务器 http://apache.etoak.com//httpd/binaries/win32/httpd-2.2.21-win32-x86-no_ssl.msi 2、安装后,打开安装目录下conf/httpd.conf文件
3、去掉注释
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
在最下面增加:
<VirtualHost *:80>
<Location /web2>
SetHandler proxy-server
order allow,deny
Allow from all
</Location>
RewriteEngine on
RewriteRule ^/web1/(.*)$ http://localhost:8080/web1/$1 [L,R=301,P,NC]
RewriteRule ^/web2/(.*)$ http://localhost:8082/web2/$1 [L,R=301,P,NC]
</VirtualHost>
这样配置就完成了,解释下上面两个 rewriterule 的含义,其余的找上面给出的两篇资料参考
上面的web1和web2其实是两个项目部署在不同的tomcat中,端口分别为8080和8082
web1中的index.jsp文件:
Html代码 <a href="void()" title="收藏这段代码" false;">
<html>
<head>
</head>
<scripttype="text/javascript">
function cc(){
window.frames['ifr'].test('web1');
}
</script>
<body>
<inputid="btn"type="button"value="ADD"onclick=" cc();"< /span>/>
<iframename="ifr"src="http://localhost/web2/index.jsp"width=800height=600></iframe>
</body>
</html><html> <head> </head> <script type="text/javascript"> function cc(){ window.frames['ifr'].test('web1'); } </script> <body> <input id="btn" type="button" value="ADD" cc();" /> <iframe name="ifr" src="http://localhost/web2/index.jsp" width=800 height=600></iframe> </body> </html>
web2中的index.jsp文件:
Html代码 <a href="void()" title="收藏这段代码" false;">
<html>
<scripttype="text/javascript">
function test(s){
var div = document.createElement("div");
div.innerHTML = s;
document.body.appendChild(div);
}
</script>
<body>
web2
</body>
</html><html> <script type="text/javascript"> function test(s){ var div = document.createElement("div"); div.innerHTML = s; document.body.appendChild(div); } </script> <body> web2 </body> </html>
注:
访问web1中的index页面必须要用 http://localhost/web1/index.jsp 才会解决跨域问题,必须要和iframe的src(localhost)相同,IP同理
相关文章推荐
- Apache Mod_Rewrite实现URL重写的配置方法
- 关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)
- Apache+Tomcat实现负载均衡及集群(session同步)--三、动静分离(2)使用mod_proxy
- 使用Apache的mod_proxy实现apache负载均衡
- Apache Mod_Rewrite实现URL重写的配置方法
- 利用mod_proxy实现Apache和Tomcat整合负载均衡
- Tomcat负载均衡原理详解及配置(Apache2.2.19+Tomcat7.0.12) mod_proxy_blancer方式已经成功实现
- Apache mod_rewrite实现HTTP和HTTPS重定向跳转
- 关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)
- Apache+Tomcat实现负载均衡及集群(session同步)--四、负载均衡(2)使用mod_proxy
- PHP通过apache的mod_rewrite实现伪静态
- apache中通过mod_rewrite实现伪静态页面的方法
- PHP通过apache的mod_rewrite实现伪静态
- 关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能
- Apache Mod_Rewrite实现URL重写的配置方法
- Apache Mod_Rewrite实现URL重写的配置方法
- Apache实现js跨域——反向代理
- apache + tomcat +js + css 实现分离跨域
- 如何通过Apache mod_proxy 实现向后端反向代理,负载均衡。
- Apache中利用mod_rewrite实现防盗链