[转帖]JS跨域:利用apache的代理模块完美实现方法

admin 发表于 [Javascript] 分类,标签: 跨域
0

在做ajax互动效果时,我们需要利用Microsoft.XMLHTTP组件获取远程信息,但出于安全问题,javascript是不允许跨域的,只能在本域内操作数据。而这对于需要进行跨域获取数据的应用来说,无疑是一大障碍。

在研究了众多可以实现js跨域的方法后,发现利用 apache 的proxy代理模块功能,就可以实现完美的js跨域处理了。特和大家分享如下:

1.首先要开启apache的rewrite重写模块和proxy代理模块。

修改apache配置文件 conf/httpd.conf ,去掉以下三行前边的#号

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so

LoadModule rewrite_module modules/mod_rewrite.so

重启apache.

2.编写rewrite规则,在当前目录里的.htaccess文件里加入以下语句:

RewriteEngine on

RewriteBase /

RewriteRule ^call-(.*)$ http://www.admpub.com/blog/s?wd=$1 [L,R,P,NC]

需要注意的是RewriteRule 后边的重写规则参数

L 立即停止重写操作,并不再应用其他重写规则。

R 是强制外部重定向,因为是要跨域定向到外部域,所以必须有R

P 是强制使用代理转发,这个也是必须的.

NC 是不区分大小写,这个倒是可选,但是为了增加兼容性,最好还是加上.

这里特别要注意的是P参数,如果没有P参数,ie会弹出”该页正在访问其控制范围外的信息,这有些危险.是否继续?”的对话框.点”是”的话还是可以继续的;firefox会得到”302 Found”的错误提示.

做完以上工作后,就基本OK了。现在可以尝试用ajax请求 http://www.shang-xun.com/call-key 会发现得到的数据是apache已经重新定向了的 http://www.admpub.com/blog/s?wd=key 的数据。

这种方式实现的js跨域飘易认为是比较完美的。但需要你有服务器权限,才可以开启 apache配置文件 conf/httpd.conf 的代理模块,重写模块一般的服务器都是开启的。

下面再公布一段利用这个js跨域的方法实现的ajax代码:

<script language="javascript">
function getd(){
try{
var xmlHttp;
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlHttp.open("get","http://localhost/call-qq",false);
xmlHttp.send("");
var strhtml=xmlHttp.responseText;

reg=/blank">.*?<\/a>/igm;
result=strhtml.match(reg); //飘易注:返回数组
if(result){
var ss="";
for(var i=0; i<result.length; i++){
ss2=result[i].replace(/blank">/ig,"");
ss2=ss2.replace(/<\/a>/ig,"");
ss += ss2+"|";
}
}
else{ss="";}

//alert(ss);
document.getElementById("tt").innerHTML=ss;

xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST", "http://www.shang-xun.com/1.php", false); //提交服务器脚本处理好后返回
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send("d="+escape(ss)); //传输先编码
strText = unescape(xmlhttp.responseText); //解码

alert(strText);

}catch(ex){alert(ex.description);}
}
</script>

<input type="button" name="a" value="chick here" onclick="getd()" />
<span id='tt'></span>

以上就是比较全面的方法了(注意 js 是区分大小写的)。但是现在遇到一个问题,就是使用apache的代理模块和重写模块后,我没有实现的功能是: “http://www.shang-xun.com/call-你好” 如果重定向里有汉字,就无法实现重定向了,错误代码如下:

“Proxy Error

The proxy server received an invalid response from an upstream server.

The proxy server could not handle the request GET /call-好.

Reason: DNS lookup failure for: www.piaoyi.org”

如果对汉字进行url编码,如编码成 http://localhost//call-%BA%C3 ,RewriteRule规则识别不了百分号 %,apache会返回 :“403 Forbidden You don't have permission to access /call- 好

on this server”错误。

发表我的评论