1

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

$.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,但不适用于外部站点。这是为什么?是因为 url 是 localhost 吗?但是我已经在外部站点上测试了其他一些本地主机脚本并且它可以工作。例如,我插入了带有 localhost URL 的 CSS 脚本http://127.0.0.1/css/sample.css并将其放置到外部站点中,并且 CSS 样式可以正常工作。

4

2 回答 2

2

这违反了同源政策

阅读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。

于 2012-07-15T05:17:34.327 回答
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;
}
?>
于 2012-07-15T04:59:22.597 回答