Javascript 如何理解php代理权(解决跨域/SOP问题)
经过两天的研究和对php的快速学习。我终于有点累了,想把我知道的东西都写下来,试着用一种严谨、简单的方式提问。所以也许以后一些初学者可以在这里找到一些有用的信息 下面是我对php代理的理解,它旨在解决跨源/跨域问题Javascript 如何理解php代理权(解决跨域/SOP问题),javascript,php,ajax,proxy,Javascript,Php,Ajax,Proxy,经过两天的研究和对php的快速学习。我终于有点累了,想把我知道的东西都写下来,试着用一种严谨、简单的方式提问。所以也许以后一些初学者可以在这里找到一些有用的信息 下面是我对php代理的理解,它旨在解决跨源/跨域问题 您不能只将ajax请求发送到另一个域(GET或POST),它将由于SOP(同源策略)而被浏览器阻止 当然,您可以将请求的url直接提供给浏览器,并获取所需的信息 我对代理php的理解是这样的:就像代理php在2中为您做的事情,它向服务器发出请求,获取信息,将信息返回给您。这样你以后就
proxy.php
中:
<?php
$nix="";
$type=$_GET['requrl'];
if ($_GET['requrl'] != $nix) {
$file = file_get_contents($_GET['requrl']);
}
elseif ($_POST['requrl'] != $nix) {
$file = file_get_contents($_POST['requrl'], false, $_POST['data']);
}
else {
$file = "false type";
}
echo $file;
?>
很简单吧?然而,我仍然无法理解为什么人类将url放在“数据”中,并为其创建一个“requrl”。但是没关系。因为它有效
然后我想尝试“POST”方法,在该方法中,我需要将一个xml文件发布到目标服务器,服务器将进行一些计算并返回结果。这是我在proxy.php
中尝试的(使用了我在堆栈溢出中找到的所有内容):
此ajax请求的状态代码始终为200 OK,但我从未收到任何回复。因为我认为“200 OK”只意味着我成功地将请求发送到了proxy.php,但是proxy.php是如何连接到目标服务器的,或者proxy.php中是否有任何错误,我不知道。
所以我的问题是:
数据:xml
)
尝试使用cURL而不是使用file\u get\u内容。像Guzzle这样的图书馆可能会使它更简单,也希望你能给我们提供建议。在搜索过程中我看到了很多。但是因为我对php几乎一无所知,所以我只尝试了无旋度的解决方案。对于php初学者来说,这会很难吗?找到教程和阅读文档应该不难
var url = 'https://www.example.com/example?'
url = encodeURI(url);
$.ajax({
type: 'GET',
url: 'proxy.php',
data: {requrl: url}
}).done(function(res) {
// handle the response
})
<?php
$nix="";
$type=$_GET['requrl'];
if ($_GET['requrl'] != $nix) {
$file = file_get_contents($_GET['requrl']);
}
elseif ($_POST['requrl'] != $nix) {
$postdata = http_build_query(
array(
'data' => $_POST['data']
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/xml',
'content' => $_POST['data']
)
);
$context = stream_context_create($opts);
$file = file_get_contents($_POST['requrl'], false, $context);
}
else {
$file = "false type";
}
echo $file;
?>
function sendPOSTRequest(xml) {
var url = 'https://www.example.com/example?';
url = encodeURI(url);
$.ajax({
type: "POST",
url: "proxy.php",
data: {
requrl: url,
data: xml
},
success: function (response) {
console.log('POST: ', response);
},
error: function (jqXHR, textStatus, errorThrown) {
console.log("error: ", textStatus, errorThrown);
alert("POST failed");
}
});
}