php不用jsonp也能跨域

austindev 2016-05-28

js跨域方式无非就是使用jsonp,这种方法很大众,还有一种方式也可以,那就是在服务器端设置允许任何访问

PHP中代码为:

[php]viewplaincopyprint?在CODE上查看代码片派生到我的代码片

01.header("Access-Control-Allow-Origin:*");//允许任何访问(包括ajax跨域)

PHP跨域访问的3种方法

近来项目中遇到跨服务器访问的问题,研究了好些日子,总结如下:

1、用file_get_contents方法

$host='url';

$randomNumber=file_get_contents($host);

echo$$randomNumber;

2、用Curl

$host='url';

$ch=curl_init();

curl_setopt($ch,CURLOPT_URL,$host);

//返回结果

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch,CURLOPT_HEADER,0);

//使用POST提交

curl_setopt($ch,CURLOPT_POST,1);

//POST参数

$str=array('a=1','b=2','c=3');

curl_setopt($ch,CURLOPT_POSTFIELDS,$str);

//结果

$res=curl_exec($ch);

curl_close($ch);

使用curl库,使用curl库之前,你可能需要查看一下php.ini,查看是否已经打开了curl扩展

3、用fopen打开url,以get方式获取内容

<?php

$url="http://www.dnjs.net/";

$fp=fopen($url,'r');

while(!feof($fp)){

$result.=fgets($fp,1024);

}

echo"$result";

fclose($fp);

?>

将网页设置为允许XMLHttpRequest跨域访问

在非IE下,使用XMLHttpRequest不能跨域访问,

除非要访问的网页设置为允许跨域访问。

将网页设置为允许跨域访问的方法如下:

Java

Response.AddHeader("Access-Control-Allow-Origin","*");

或指定域名下可以访问:

Response.AddHeader("Access-Control-Allow-Origin","http://www.1688hot.com:80");

PHP

echo:header("Access-Control-Allow-Origin:*");

echo:header("Access-Control-Allow-Origin:http://www.1688hot.com:80");

html

<metahttp-equiv="Access-Control-Allow-Origin"content="*">

<metahttp-equiv="Access-Control-Allow-Origin"content="http://www.1688hot.com:80">

在返回的响应信息中,使用Access-Control-Allow-Origin头来控制哪些域名的脚本可以访问该资源。如果设置Access-Control-Allow-Origin:*,则允许所有域名的脚本访问该资源。如果有多个,则只需要使用逗号分隔开即可。

注意:在服务器端,Access-Control-Allow-Origin响应头中的端口信息不能省略。

HTTPS和HTTP的区别:

https协议需要到ca申请证书,一般免费证书很少,需要交费。

http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。

http的连接很简单,是无状态的。

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议要比http协议安全。

在被请求的php文件里增加:

header(“Access-Control-Allow-Origin:*”);

header(“Access-Control-Allow-Methods”,“POST,OPTIONS,GET”);

另外:

在chrome浏览器或者firefox浏览器里,由于安全限制的原因,本地调试JS,如果不配服务器环境而直接打开页面,那所有的AJAX操作会抛出下面错误:

XMLHttpRequestcannotloadfile:///D:/file.html.OriginnullisnotallowedbyAccess-Control-Allow-Origin.

OriginnullisnotallowedbyAccess-Control-Allow-Origin.的意思就是由于安全原因浏览器不允许跨域访问。

chrome、firfox、opera都出现了这种情况,因为有安全沙箱,它们认为加载本地其它html文件为跨域访问。但是使用IE8就不会出现这种错误,很多人不是很理解。

这里Windowshelpandsupport做出了解释IE本身也并不是允许跨域的因为这样很不安全,但是如果不跨域的话又带来很多不便,所以会让你手动的选择一下是否允许跨域。而chrome、firfox、opera则默认就是不允许。

另外:

CORS的一篇文章:

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

另外:

如果脚本可以和同域的php交互的话,可以使用php的curl等方式帮助传输数据。

相关推荐