1.缘由:做一个调用接口的测试,发现不管怎么调用http://www.kuaidi100.com/query这个接口都会产生跨域,有时候还能获取到数据 2.在FCC群里请教各位基佬的时候,有一个老哥提出了用nginx代理解决跨域问题
3于是我首先恶补了下解决跨域的几个方法以及跨域的原因
这里简单介绍一下反向代理:如下图所示,用户A一直使用原始服务器B的资源,但是用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。
js跨域解决方案 a.通过jsonp跨域 b.通过修改document.domain来跨子域 c.使用window.name来进行跨域 d.使用HTML5中新引进的window.postMessage方法来跨域传送数据
ajax跨域大同小异,这只是我的一些愚见 有不对的地方 请以wiki的解释为准
我这里采用apache 反向代理
<VirtualHost *:8082>
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /query http://www.kuaidi100.com/query
</VirtualHost>
请求如下
$("#submit1").click(function() {
var cp = $("#cp").find("option:selected").val();
var cpd = $('#cpd')[0].value;
var exprssurl = "http://127.0.0.1:8082/query?type=" + cp + "&postid=" + cpd;
$.getJSON(exprssurl, function(data) {
var obj = document.getElementById('content1');
var ex = data;
var text = [];
text.push("快递单号: " + data.nu);
text.push("快递详情: " + data.message);
text.push("快递公司: " + data.com);
text.push("其他: " + data.data);
obj.innerText = text.join("\n ")
});