同源政策
1995年,同源政策由 Netscape(網(wǎng)景) 公司引入瀏覽器幔嗦。目前酿愧,所有瀏覽器都實(shí)行這個(gè)政策。
最初邀泉,它的含義是指嬉挡,A 網(wǎng)頁(yè)設(shè)置的 Cookie,B 網(wǎng)頁(yè)不能打開汇恤,除非這兩個(gè)網(wǎng)頁(yè)同源庞钢。所謂同源指的是三個(gè)相同。
協(xié)議相同(http https)
域名相同
端口相同(默認(rèn)80端口)
隨著互聯(lián)網(wǎng)的發(fā)展因谎,同源政策越來越嚴(yán)格基括,目前非同源的站點(diǎn)發(fā)出請(qǐng)求會(huì)受到以下限制
Cookie無法讀取。
DOM 無法獲得财岔。
JAX 請(qǐng)求無效(可以發(fā)送风皿,但瀏覽器會(huì)拒絕接受響應(yīng))
跨域請(qǐng)求
違反了同源政策河爹,就屬于跨域請(qǐng)求
新建 index.html
<script>
var xhr = new XMLHttpRequest();
xhr.open('get', 'http://local.b.com');
res = xhr.send();
</script>
服務(wù)端的響應(yīng) index.php
echo "汝何人?敢入我室";
image
這種情況下桐款,請(qǐng)求依然是有發(fā)出到服務(wù)端的咸这,可以從網(wǎng)絡(luò)請(qǐng)求中看到,但客戶端無法獲取相應(yīng)的數(shù)據(jù)
image
用代理的方式
$host = 'local.b.com';
$url = 'http://local.b.com/index.php';
$ip = '127.0.0.1';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, str_replace($host, $ip, $url));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: {$host}"));
curl_setopt($ch,CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
此時(shí)魔眨,控制臺(tái)就不會(huì)有報(bào)錯(cuò)信息了
這種方式肯定是不可持續(xù)的媳维,多了個(gè)中間商的環(huán)節(jié),平添了許多成本
最好的方式當(dāng)然是直接對(duì)話遏暴,此時(shí)就需要讓客戶端攜帶一個(gè)標(biāo)識(shí)侄刽,服務(wù)端檢測(cè)到標(biāo)識(shí)后放行
cors
header('Access-Control-Allow-Origin:*');
echo "誰(shuí)都可以進(jìn)來";
開放給所有人
這樣顯然不安全,可以指定某個(gè)網(wǎng)站
$allow = [
'http://local.a.com',
'http://local.c.com',
];
// 獲取來訪域名
$domain = $_SERVER['HTTP_ORIGIN'];
if (in_array($domain, $allow)) {
header('Access-Control-Allow-Origin:' . $domain);
}
echo "你被翻牌了朋凉,今晚就留下吧...";