访问控制原因错误

时间:2012-10-12 04:10:03

标签: php html

我正在尝试在ASP.Net CMS上调用PHP函数。我在不同的域上托管PHP文件,我收到以下错误。

XMLHttpRequest无法加载网址。 Access-Control-Allow-Origin不允许使用Origin url。

我添加了标题('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'];
}

?>

这个东西对我来说相当新,所以任何建议或建议都值得赞赏。

谢谢:)

2 个答案:

答案 0 :(得分:0)

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

  • 在域中创建一个js文件,如php api。
  • 使用<script type="text/javascript" src="path to js file"></script>代码
  • 在该脚本中调用您的函数

  • 因为它与.php属于同一个域,所以你不会遇到跨域限制问题;)

    答案 1 :(得分:0)

    如果你的代码确实是:

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

    然后它应该工作正常。但是,在您对问题的描述中,您似乎正在尝试执行此操作:

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

    这是不允许的,因为它破坏了浏览器的相同原始策略(程序员不能覆盖,只有用户,甚至只能在某些浏览器中)。 XMLHttpRequest只能用于同一域的url。

    标准的解决方法是通过ASP服务器代理请求。例如,您将发出如下请求:

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

    data.asp只是一个通过HTTP获取data.php响应的脚本。服务器端没有限制。根据服务器的不同,您甚至可以在服务器配置中使用代理或重定向模块而无需任何脚本执行此操作。例如,您可以使用mod-rewrite配置Apache以代理页面,如下所示:

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

    还有其他解决方案不需要代理,例如脚本标记hack(也称为jsonp,google)。像YUI这样的库可以通过使用Flash模块绕过浏览器的相同原始策略来进行跨域ajax调用。 Flash通常没有相同来源政策的限制,这就是为什么你可以在你的网站上嵌入youtube视频。