10

我对 jquery post 函数有一个相当令人沮丧的问题,这可能源于不了解它是如何正常工作的。

我有一个函数应该将一些表单信息发布到我编写的 php 脚本中,然后该脚本针对 API 运行 curl 请求以绕过 javascript 的跨域策略。只要它提交到“http”,它似乎就可以正常工作,但是当我将它发送到“https”时,表单永远不会被提交。

我在我的电脑上运行了wireshark,它没有显示到目标ip的流量,直到我让url使用http。我在服务器上有基本的身份验证,所以我通过 url 传递用户和密码,但没有在那里进行测试并得到相同的结果。

这是不工作的代码:

$j.post("https://<api user>:<password>@<ip>:444/ProxyScript.php", 
         $j("#spoke_ticket").serialize(),
         function(msg) { 
              log_status(msg);
              fade_status();
              $j(':input','#createtheticket')
                   .not(':button, :submit, :reset, :hidden')
                   .val('')
                   .removeAttr('checked')
                   .removeAttr('selected');
               });

这是工作功能:

$j.post("http://<other ip>/ProxyScript.php",  
        $j("#spoke_ticket").serialize(),
        function(msg) { 
              log_status(msg);
              fade_status();
              $j(':input','#createtheticket')
                   .not(':button, :submit, :reset, :hidden')
                   .val('')
                   .removeAttr('checked')
                   .removeAttr('selected');
               });

关于为什么没有发送流量的任何想法?如果我遗漏了一些关键信息或任何内容,请告诉我。

谢谢您的帮助

4

2 回答 2

2

如果您正在从 http 页面到 https URL 进行 AJAX 发布,那么跨域策略就会生效,因为该协议也是原始规范的一部分,如此处所述。浏览器将拒绝进行 AJAX 调用,这就是您看不到任何流量的原因。

这里讨论了一个解决方案:

在 http 页面上使用 https 的 Ajax

所以你最好的选择是现在大多数现代浏览器都应该支持的Access-Control-Allow-Origin标头。

因此,让您的服务器将以下标头添加到响应中:

Access-Control-Allow-Origin: https://www.mysite.com

如果由于某种原因您无法强制执行此操作,那么剩下的唯一选择就是JSONP

于 2012-10-17T21:06:08.777 回答
0

为什么不使用代理来解决跨域问题?听起来更容易。一个简单的例子是当我想检索丹麦政府国家地理数据的县、道路名称等(幸运的是,他们的数据是 json 或 XML 可选)

简化的proxy.php

<?
header('Content-type: application/json');
$url=$_GET['url'];
$html=file_get_contents($url);
echo $html;
?>

在 ajax 中,获取县边界的纬度/经度

var url= "proxy.php?url=https://geo.oiorest.dk/"+type+"/"+nr+"/graense.json";           
$.ajax({
  url: url,
  dataType: 'json',
  success:  function (data) {
   ...

}); 

注意 https - url 可能是真实的例子,https://geo.oiorest.dk/kommuner/0810/graense.json

于 2012-10-17T21:39:49.290 回答