php解決跨域問(wèn)題的方法詳解
跨域的嚴(yán)格一點(diǎn)來(lái)說(shuō)就是只要協(xié)議,域名,端口有任何一個(gè)的不同,就被當(dāng)作是跨域。
比如,在實(shí)際項(xiàng)目中由于前后端分離當(dāng)前端需要通過(guò)接口向后臺(tái)發(fā)起請(qǐng)求,此時(shí)就會(huì)出現(xiàn)跨域問(wèn)題,那么,這類問(wèn)題需要如何解決呢?
其實(shí)php解決跨域問(wèn)題很簡(jiǎn)單,只需加上下面的代碼就可以了:
header("Access-Control-Allow-Origin:*");
加上這行代碼表示允許所有的域名訪問(wèn),不過(guò)為了安全起見(jiàn),在實(shí)際項(xiàng)目中往往會(huì)限定只允許固定的幾個(gè)域名和方法發(fā)起的請(qǐng)求。
1、允許單個(gè)域名訪問(wèn)
header('Access-Control-Allow-Origin:http://www.startphp.cn');
header('Access-Control-Allow-Methods:POST'); //表示只允許POST請(qǐng)求
header('Access-Control-Allow-Headers:x-requested-with, content-type'); //請(qǐng)求頭的限制
2、不限制域名
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST');//表示只允許POST請(qǐng)求
header('Access-Control-Allow-Headers:x-requested-with, content-type');
3、允許多個(gè)域名訪問(wèn)
在實(shí)際項(xiàng)目中最好指定能跨域訪問(wèn)的域名,增加安全性??梢詫懺谝粋€(gè)公共類里面,封裝一個(gè)方法調(diào)用。
// 設(shè)置能訪問(wèn)的域名
static public $originarr = [
'https://test1.com',
'https://test2.com',
];
/**
* 公共方法調(diào)用
*/
static public function setheader()
{
// 獲取當(dāng)前跨域域名
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
if (in_array($origin, self::$originarr)) {
// 允許 $originarr 數(shù)組內(nèi)的 域名跨域訪問(wèn)
header('Access-Control-Allow-Origin:' . $origin);
// 響應(yīng)類型
header('Access-Control-Allow-Methods:POST,GET');
// 帶 cookie 的跨域訪問(wèn)
header('Access-Control-Allow-Credentials: true');
// 響應(yīng)頭設(shè)置
header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token');
}
}在php上如何實(shí)現(xiàn)
<?php
// 制定允許其他域名訪問(wèn)
header("Access-Control-Allow-Origin:*");
// 響應(yīng)類型
header('Access-Control-Allow-Methods:POST');
// 響應(yīng)頭設(shè)置
header('Access-Control-Allow-Headers:x-requested-with, content-type');
//$callback = isset($_REQUEST['callback']) ? trim($_REQUEST['callback']) : ''; //jsonp回調(diào)參數(shù),必需
function getKey($key,$default=""){
return trim(isset($_REQUEST[$key])?$_REQUEST[$key]:$default);
}
$id = getKey("id");
$conn = mysqli_connect("localhost","root","","test") or die("連接失敗");
$conn->query("set names utf8");
$sql = "select * from data where ".$id." is not null";
$result = $conn->query($sql);
$arr = [];
while($row=$result->fetch_assoc()){
array_push($arr,json_encode($row));
}
$json = json_encode($arr); //json 數(shù)據(jù)
print_r($json);4 Nginx反向代理
使用nginx反向代理實(shí)現(xiàn)跨域,是最簡(jiǎn)單的跨域方式。只需要修改nginx的配置即可解決跨域問(wèn)題,支持所有瀏覽器,支持session,不需要修改任何代碼,并且不會(huì)影響服務(wù)器性能。
實(shí)現(xiàn)思路:通過(guò)nginx配置一個(gè)代理服務(wù)器(域名與domain1相同,端口不同)做跳板機(jī),反向代理訪問(wèn)domain2接口,并且可以順便修改cookie中domain信息,方便當(dāng)前域cookie寫入,實(shí)現(xiàn)跨域登錄。
修改配置文件nginx.conf,如下:
// proxy服務(wù)器
server {
listen 81;
server_name www.domain1.com;
location / {
proxy_pass http://www.domain2.com:8080; #反向代理
proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名
index index.html index.htm;
# 當(dāng)用webpack-dev-server等中間件代理接口訪問(wèn)nignx時(shí),此時(shí)無(wú)瀏覽器參與,故沒(méi)有同源限制,下面的跨域配置可不啟用
add_header Access-Control-Allow-Origin http://www.domain1.com; #當(dāng)前端只跨域不帶cookie時(shí),可為*
add_header Access-Control-Allow-Credentials true;
}
}
配置修改好后,再重啟nginx。
index.html文件訪問(wèn)代理服務(wù)器
// index.html
var xhr = new XMLHttpRequest();
// 前端開關(guān):瀏覽器是否讀寫cookie
xhr.withCredentials = true;
// 訪問(wèn)nginx中的代理服務(wù)器
xhr.open('get', 'http://www.domain1.com:81/?user=admin', true);
xhr.send();
server.js
// server.js
var http = require('http');
var server = http.createServer();
var qs = require('querystring');
server.on('request', function(req, res) {
var params = qs.parse(req.url.substring(2));
// 向前臺(tái)寫cookie
res.writeHead(200, {
'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly' // HttpOnly:腳本無(wú)法讀取
});
res.write(JSON.stringify(params));
res.end();
});
server.listen('8080');
console.log('Server is running at port 8080...');以上就是php解決跨域問(wèn)題的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于php解決跨域的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP實(shí)現(xiàn)抓取百度搜索結(jié)果頁(yè)面【相關(guān)搜索詞】并存儲(chǔ)到txt文件示例
這篇文章主要介紹了PHP實(shí)現(xiàn)抓取百度搜索結(jié)果頁(yè)面【相關(guān)搜索詞】并存儲(chǔ)到txt文件,涉及php基于curl的頁(yè)面抓取及正則匹配相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
php下HTTP Response中的Chunked編碼實(shí)現(xiàn)方法
有時(shí)候,Web服務(wù)器生成HTTP Response是無(wú)法在Header就確定消息大小的,這時(shí)一般來(lái)說(shuō)服務(wù)器將不會(huì)提供Content-Length的頭信息,而采用Chunked編碼動(dòng)態(tài)的提供body內(nèi)容的長(zhǎng)度。2008-11-11
php中print(),print_r(),echo()的區(qū)別詳解
本文介紹了php函數(shù)print(),print_r(),echo()的區(qū)別,這里推薦給大家,需要的朋友可以參考下2014-12-12
PHP學(xué)習(xí)筆記 (1) 環(huán)境配置與代碼調(diào)試
學(xué)習(xí)php第一步就是需要配置php運(yùn)行環(huán)境,這個(gè)是基礎(chǔ),需要的朋友可以參考下。2011-06-06

