2012-10-12 24 views
0

我想调用ASP.Net CMS上的PHP函数。我在不同的域上托管PHP文件,并且出现以下错误。访问控制起源错误

XMLHttpRequest无法加载网址。原始网址不被Access-Control-Allow-Origin所允许。

我已添加标题('Access-Control-Allow-Origin:*');根据本网站上其他主题中的一些建议转换为PHP文件,但对我而言并没有什么不同。

这里是我的代码:

HTML

<html> 
<head> 
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 
<script type="text/javascript"> 
$(document).ready(function(){ 
     $.post('http://10.254.2.54/adobe%20air/application/Pulse/data.php', { 
      'text': $("#preceda").text() 
     }, 

     function(response){ 

      $("#details").html(response); 

     }); 

    }); 

</script> 
</head> 
<body> 

<div id="preceda"> 
    32384 
</div> 

<br /> 
<div id="details"></div> 

</body> 
</html> 

PHP

<?php 

header('Access-Control-Allow-Origin: *'); 

if (isset($_POST['text'])){ 
    $q = addslashes(trim($_POST['text'])); 
} 

// Connection script 
$serverName = "***"; 
$uid = "***"; 
$pwd = "***"; 
$connectionInfo = array("UID"=>$uid, "PWD"=>$pwd, "Database"=>"***"); 

$conn = sqlsrv_connect($serverName, $connectionInfo); 

if($conn === false) 
{ 
    echo "<error>Connect Failure</error>"; 
    die(print_r(sqlsrv_errors(), true)); 
} 

function checkQuery($theQuery, $theSQL) 
{ 
    if($theQuery === false) 
    { 
    echo "<error>Query Failure: ".$theSQL."</error>"; 
    die(print_r(sqlsrv_errors(), true)); 
    } 
} 

// Get the data 
$tsql = "SELECT * FROM VG_LD_DS.dbo.VU_LearnAchievePreceda WHERE userID = '".$q."'"; 
$stmt = sqlsrv_query($conn, $tsql); 
checkQuery($stmt, $tsql); 

$i = 0; 

while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) 
    { 
    if($i == 0) 
    { 
     $names = array($row); 
    } 
    else 
    { 
     array_push($names, $row); 
    } 
    $i = 1; 
    } 
header('Access-Control-Allow-Origin: *'); 
foreach ($names as $name) { 
    echo $name['telstraID']; 
} 

?> 

这东西是相当新的给我,所以任何意见或建议被赞赏。

谢谢:)

+0

无法看到任何代码会导致同源违规......您确定您的ajax请求没有在某个地方被重定向到异地吗? –

+0

是的,这很抱歉,我想我的代码并不清楚。data.php被托管在具有ajax请求的页面的不同内部服务器上。 – user1443449

+0

这可以使用JSONP或'CURL' – diEcho

回答

0

我有同样的问题,这是我的解决方案:

  • 在域作为PHP API创建一个js文件。
  • 使用<script type="text/javascript" src="path to js file"></script>标签
  • 调用脚本

  • ,因为它是在同一个域中,你将不会运行到跨域限制的问题.php为你的内部功能;)

    +0

    我将脚本转移到与PHP文件相同的域名上的JS文件,不幸的是我得到了同样的错误:(感谢您的建议。 – user1443449

    +0

    您是否将文件中的位置更改为本地主机? – SparK

    +0

    不,我做了在JS文件中留下完整的地址,我把它放在与PHP文件相同的域中。我试图删除JS中的完整地址以获得'data.php',但是浏览器看起来像试图寻找它在另一个域中 – user1443449

    0

    如果你的代码真的是:

    $.post('data.php', ... 
    

    然后它应该工作正常。然而,在你对问题的描述,似乎你要做到这一点,而不是:

    $.post('http://some.other.domain.com/data.php', ... 
    

    这是不允许的,因为它打破了浏览器的同源策略(不能由程序员来覆盖,只有用户,甚至只在某些浏览器中)。 XMLHttpRequest只能针对同一个域的url。

    标准解决方法是通过ASP服务器代理请求。因此,例如,你会做出这样的请求:

    $.post('data.asp', ... 
    

    而且data.asp很简单,就是通过获取的HTTP响应data.php的脚本。服务器端没有限制。根据服务器的不同,您甚至可以在服务器配置中使用代理或重定向模块,而无需执行任何脚本。例如,你可以像这样与国防部重写配置Apache代理页:

    RewriteRule /data.php http://some.other.domain.com/data.php [P] 
    

    有一些并不需要的脚本标签黑客进行代理的其他解决方案(也称为JSONP,google一下) 。一些类似YUI的库可以通过使用Flash模块来绕过浏览器的相同源策略来跨域调用Ajax。 Flash通常不会限制相同的来源策略,因此您可以在自己的网站上嵌入YouTube视频。

    +0

    感谢你的广泛响应。我在这里的绊脚石将写一个ASP脚本来获取data.php脚本。我不知道从哪一个开始。我会google脚本标记hack,看看我能从中得到什么。 – user1443449

    相关问题