我对jquery post函数有一个相当令人沮丧的问题,可能源于不了解它是如何正常工作的。
我有一个函数,应该将一些表单信息发布到我编写的php脚本,然后该脚本运行针对API的curl请求以绕过javascript的跨域策略。它似乎工作正常,只要它提交“http”,但当我发送到“https”时,表单永远不会被提交。
我在计算机上运行wireshark,它显示没有流向目标IP的流量,直到我使用http。我在服务器上有基本身份验证,所以我通过网址传递用户和密码,但没有测试就得到了相同的结果。
以下是无效代码:
$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');
});
关于为什么没有发送流量的任何想法? 如果我遗漏了一些重要信息或其他任何内容,请告诉我。
感谢您的帮助
答案 0 :(得分:2)
如果您正在从http页面到https URL执行AJAX帖子,那么跨域策略就会启动,因为该协议也是原始规范的一部分,如here所述。浏览器将拒绝拨打AJAX电话,这就是为什么你没有看到任何流量。
这里讨论一个解决方案:
Ajax using https on an http page
所以你最好的选择是Access-Control-Allow-Origin标题,现在大多数现代浏览器都应支持它。
因此,请让您的服务器在响应中添加以下标头:
Access-Control-Allow-Origin: https://www.mysite.com
如果由于某种原因你无法强制执行此操作,那么剩下的唯一选择就是JSONP。
答案 1 :(得分: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 - 网址可以是,例如,https://geo.oiorest.dk/kommuner/0810/graense.json