带有bookmarklet麻烦的ajax jquery与PHP

时间:2012-07-15 04:48:43

标签: php jquery ajax localhost bookmarklet

我设置了书签。我在整个页面都有警报检查我的代码,由于某种原因我的ajax无法正常工作。它在localhost上运行得很好,但是当我在外部站点上测试时,它失败了

$.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

});

此脚本适用于localhost,但它不适用于外部站点。这是为什么?是因为网址是localhost吗?但我已经在外部网站上测试了一些其他localhost脚本并且它可以工作。例如,我已经插入了带有localhost URL http://127.0.0.1/css/sample.css的CSS脚本,并将其放入外部站点并且CSS样式工作。

2 个答案:

答案 0 :(得分: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: *');
?>

使用*指定任何网站,因为它是一本书籍小册子。

答案 1 :(得分:1)

当您说“外部”网址时,您指的是此网页运行的网站以外的其他网站吗?如果是这样,我最初的想法是你遇到了使用ajax调用的安全限制。

请参阅:http://en.wikipedia.org/wiki/Same_origin_policy

如果您尝试对远程服务器进行ajax调用,它将执行而不会出现错误,但响应将完全返回空白。浏览器不允许您使用响应来执行任何操作。我似乎记得对它感到沮丧,因为成功或错误事件都没有触发,因为jQuery没有没有来做出决定。

您需要将sites.php放在同一个站点上,或者创建一个获取远程文件的本地php页面。如果你这样做,那么你的ajax调用可以从你的php脚本本地检索远程文件。

以下是我们用UltraCart代理ajax调用的一些代码: (我们不是一个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;
}
?>