2012-07-15 89 views
1

我有一個書籤設置。我在整個頁面發出警報以檢查我的代碼,出於某種原因,我的ajax無法正常工作。它在本地主機上的偉大工程,但是當我在外部網站上的測試,它無法ajax jquery與PHP的書籤問題

$.ajax({ 
    url: "http://127.0.0.1/sites.php", 
    type:"POST", 
    data: "site_url="+urlValue 
}).error(function(){ 
    alert("error"); 
}).done(function(data){ 
    alert("inside ajax"); 
    //some coding 

}); 

這個腳本在本地主機的工作原理,但它不會在外部網站上的工作。這是爲什麼?是因爲url是localhost嗎?但我已經在外部網站上測試了一些其他的本地主機腳本,它可以工作。例如,我已經插入了一個本地主機URL爲http://127.0.0.1/css/sample.css的CSS腳本,並將其放置到外部站點,並且CSS樣式工作。

+0

它只適用於該文件來自的服務器。當您從ABC.com(localhost)加載文件時,您是否嘗試訪問XYZ.com? – SuperSaiyan 2012-07-15 04:53:22

+0

這違反了[同源策略](http://en.wikipedia.org/wiki/Same_origin_policy) – Musa 2012-07-15 04:55:41

+0

@Thrustmaster我試圖從XYZ.com訪問ABC.com(localhost)。例如,我在$ .ajax之前添加了警報,併發出警報。所以我只是試圖訪問文件中的另一個文件$ .ajax駐留在。 – hellomello 2012-07-15 04:58:21

回答

2

這違反了same origin policy

上CORS http://www.w3.org/TR/cors/閱讀起來,http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

在sites.php開始前的任何輸出發送此

<?php 
header('Access-Control-Allow-Origin: *'); 
?> 

使用*增加指定任何網站自其bookmarlet。

+0

你能解釋我如何能夠實現這個到我的jQuery腳本?謝謝 – hellomello 2012-07-15 05:34:46

+0

'sites.php'是我無法控制的外部網站。它只是一個隨機站點,但?有沒有辦法使用jQuery將標題插入'sites.php'?謝謝! – hellomello 2012-07-15 05:43:41

+0

@andrewliu好,這是[同源策略](http://en.wikipedia.org/wiki/Same_origin_policy)的全部,以防止人們與其他人民網站搞亂 – Musa 2012-07-15 05:45:32

1

當你說'外部'網址時,你指的是一個網站而不是這個網頁正在運行的網站嗎?如果是這樣,我最初的想法是,你遇到了一個Ajax調用的安全限制。

參見:http://en.wikipedia.org/wiki/Same_origin_policy

如果試圖使一個AJAX調用一個遠程服務器,它將執行沒有錯誤,但響應會回來完全空白。瀏覽器不會允許您使用響應來執行任何操作。我似乎回想起因爲它沒有成功或錯誤事件觸發而感到沮喪,因爲沒有讓jQuery做出決定。

你將需要將sites.php放在同一個站點上,或者創建一個本地php頁面來獲取遠程文件。如果你這樣做,那麼你的ajax調用可以從你的PHP腳本本地檢索遠程文件。

下面是一些代碼,我們用它來代理Ajax和UltraCart電話: (我們不是一個PHP店,所以我會,關於如何提高它的一些建議。) 我們在本地機器上安裝它,並用它來代理我們的ajax調用。

<?php 

$server_get_url = "https://www.myremoteserver.com/somepage.php"; 
$post_data = file_get_contents('php://input'); 

foreach($_SERVER as $i=>$val) { 
    if (strpos($i, 'HTTP_') === 0) { 
     $name = str_replace(array('HTTP_', '_'), array('', '-'), $i); 
     $header[$name] = $val; 
    } 
} 

$header[] = "Content-Length: ". strlen($post_data); 

$ch = curl_init($server_get_url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 100); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 

if (strlen($post_data)>0){ 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 
} 

$response = curl_exec($ch);  

if (curl_errno($ch)) { 
    print curl_error($ch); 
} else { 
    curl_close($ch); 
// our page returns back json ... you may need to adjust this. 
    header('Content-type: application/json'); 
    print $response; 
} 
?> 
+0

雖然我收到警報('錯誤')? – hellomello 2012-07-15 05:00:53

+0

我可能記錯了。抱歉。你有FireFox的螢火蟲嗎?如果是這樣,打開控制檯並觀看請求。我記得那些違規的請求會有一個空白的迴應......或者它們被塗成紅色。 – 2012-07-15 05:02:04

+0

保存上面的php文件。我們命名我們的proxy.php。編輯$ server_get_url並將其指向您的外部文件。然後改變你的ajax指向proxy.php腳本。它會花你約5分鐘,並會讓你知道這是否是問題所在。 – 2012-07-15 05:03:46