2012-10-12 25 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

    相關問題