我正在编写这个javascript,它将在几个其他域上使用,这些域调用php脚本(仅在我的域上)来返回一个数组。我正在使用xmlhttp,它在我的域上测试时效果很好,但是一旦从单独的域放置或调用javascript它就会完全中断。有人知道如何跨域提出这个请求吗?
注意:我必须执行一个奇怪的小黑客,允许我进行两次单独的调用,并确保它们在处理之前都返回。无论如何,每次在我的域名上都能完美运行。
这是调用我的数组
的PHP代码的javascript文件function getUrls(){
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
xmlhttp2 = new XMLHttpRequest();
}
else {
// code for IE5 and IE6
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
// code for IE5 and IE6
xmlhttp2 = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && xmlhttp.status == 200 ) {
parsedJSONurls = JSON.parse(xmlhttp.responseText);
xmlhttp2.open("GET", "http://mydomain.com/connect.php?q=companies", true);
xmlhttp2.send();
}
}
xmlhttp2.onreadystatechange = function(){
if (xmlhttp2.readyState == 4 && xmlhttp2.status == 200) {
parsedJSONcompanies = JSON.parse(xmlhttp2.responseText);
runLoop(parsedJSONurls, parsedJSONcompanies);
}
}
xmlhttp.open("GET", "http://mydomain.com/connect.php?q=urls", true);
xmlhttp.send();
}
答案 0 :(得分:11)
尝试将此标题添加到您的connect.php文件
header('Access-Control-Allow-Origin: http://domain1.com, http://domain2.com');
如果您想允许所有域而不是白名单
header('Access-Control-Allow-Origin: *');
答案 1 :(得分:2)
原因是same origin policy。它旨在阻止恶意脚本访问其他网站的敏感数据。您应该考虑编写JSONP请求作为解决问题的方法。
答案 2 :(得分:1)
我去年开始的ongoing community wiki解释了许多绕过同一起源政策的方法。可以在那里找到适合您情况的解决方案。
答案 3 :(得分:1)
与其他人相同,它是由同一原产地政策引起的。
假设页面位于“a.com”,无论JavaScript文件在哪里,
只要您使用XMLHttpRequest方法,您就只能从a.com访问数据
即使是子域名a.a.com也无法访问a.com。
您可以有两个选项:
1)使用< script />标签黑客
JSONP很棒,但似乎你不依赖任何库
这是一种JavaScript性质,您可以在其他域中包含JavaScript。
< script /> tag hack是一种简单的技术,可动态创建和附加< script />节点。
它的src属性是不同域中的URL。
function getUrl(url) {
var scriptEl = document.createElement("script");
scriptEl.src = url;
scriptEl.async = true;
document.getElementsByTagName("head")[0].appendChild(scriptEl);
}
// Predefined callbacks
window.companyCallback = function (responseData) {
parsedJSONCompanies = responseData;
};
window.urlCallback = function (responseData) {
parseJSONurls = responseData;
};
getUrl("http://mydomain.com/connect.php?q=companies");
getUrl("http://mydomain.com/connect.php?q=urls");
当然,您还必须修改PHP以满足需要。
<?php
header("content-type: application/json");
if ($_GET['q'] === "urls")
{
echo "companyCallback(";
json_encode($result);
echo ");";
}
else
{
echo "urlCallback(";
json_encode($result);
echo ");";
}
?>
2)将proxy.php放在不同的域
以上方法是我推荐的方法
如果您不想大量修改代码,请改用代理技术
您必须有权在不同的主机上添加proxy.php。
像这样的内容:
<?php
$url = "http://mydomain.com/connect.php?q=" . $_GET["q"];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
echo $result;
?>
注意:请注意安全问题,您需要检查请求的来源。
在JavaScript中,您只需要将xmlhttp.open()中的url指向同一个域PHP。
xmlhttp.open("proxy.php?q=urls", true);
希望它有所帮助。
答案 4 :(得分:0)
答案 5 :(得分:0)
如上所述,大多数非html5不允许跨浏览器ajax请求。为了解决这个问题,我调用了一个远程javascript脚本。
使用javascript添加类似
的行<script type="text/javascript" src="http://www.somemedomain.xxx/myjavascript.php?arg1=xxx&arg">
在另一台服务器上的myjavascript.php文件中,您可以处理,收集从浏览器收集的信息。
你必须将php文件编码为javascript。
header( "content-type: application/javascript" ) //check php.net
这将在ie6 +
中起作用