0

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

XMLHttpRequest 无法加载 url。Access-Control-Allow-Origin 不允许 Origin url。

我添加了 header('Access-Control-Allow-Origin: *'); 根据此站点上其他线程中的一些建议,将 PHP 文件添加到 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'];
}

?>

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

谢谢 :)

4

2 回答 2

0

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

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

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

    于 2012-10-12T04:30:21.553 回答
    0

    如果您的代码确实是:

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

    然后它应该可以正常工作。但是,在您对问题的描述中,您似乎正在尝试这样做:

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

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

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

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

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

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

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

    于 2012-10-12T04:30:41.087 回答