JSONP 和 CORS 完全是两个不同的东西。
JSONP
带有 Padding 的 JSON 只是利用下载 javascript 文件时没有同源策略限制这一事实的一种技巧。由于您只能下载脚本,因此我们使用内置数据格式 JSON 而不是 XML 或 HTML。此外,您只能使用 JSONP 发出 GET 请求,因为它所做的只是创建一个 script 并将 src 设置为其他域并将其附加到您的 DOM,一旦下载,它就会被执行,这就是使用我们的回调的时候从传递 JSON 对象的原始域调用代码。
CORS
跨域资源共享是 W3C 的一项标准,它允许从另一个域请求网页上的许多资源(例如字体、JavaScript 等)。您不仅可以使用 GET,还可以使用所有常用的 HTTP 方法,如 POST、HEAD、PUT、DELETE 等
如何提出 CORS 请求:
就像将 AJAX 调用中的 url 更改为其他域一样简单,这就是客户端没有其他更改。
如果您的浏览器支持 CORS,则根据请求的类型(简单/复杂),可能会触发飞行前 OPTIONS 请求,以获取有关此域和此域允许的方法和内容类型类型的信息OPTIONS 响应将被缓存。
接下来,每当您对其他域进行 AJAX 调用时,浏览器都会在后台发送一个 Origin 请求标头。例如,如果来自 google 的页面对 facebook 进行 AJAX 调用,则会将类似这样的内容添加到请求标头中
Origin: http://google.com
当 facebook 看到此标头时,它将检查 google.com 是否在其允许主机的有效列表中,并通过发送以下标头作为响应来同意这一点。
Access-Control-Allow-Origin: http://google.com
请注意,Origin 和 Allow-Origin 标头中的主机名应匹配,以便浏览器接受并处理收到的响应。您甚至可以通过在响应中设置以下标头来限制允许的方法和自定义标头
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
最后回答您的问题,如下更改您的 Ajax 定义
$.ajax({
url: 'http://some-other-domain.com/upload.php',
data: fa,
contentType: false,
processData: false,
type: 'POST',
success: function(data) {
alert(data);
}
});
由于您只是使用文件进行简单的 POST 调用,因此它是一个简单的请求,因此 Allow-Origin 标头就足够了。在您的 PHP 中,阅读 Origin 标头检查它是否在您的列表中,并在 Allow-Origin 响应标头中设置相同的标头值。我不知道 PHP,但希望是这样的 :)
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
if($header == "Origin"){
/* check if $value is in your list
if yes, set the response header */
header('Access-Control-Allow-Origin: $value');
/* adding just this header will allow any method from this
domain, in case you need to allow only POST method add
Access-Control-Allow-Methods header as well */
break;
}
}
// do the remaining processing of request
?>
更多资源
希望这能回答你的问题:)