0

我已经安装了 Luracast 的 Restler API 框架,并且在这一切上都取得了惊人的成功,除了跨域发送 PUT 或 DELETE 时。以下在同一台服务器上工作正常,但是当我跨域时,Firebug 将 PUT 或 GET 显示为 OPTIONS,并且在服务器上找不到它。我很困惑如何停止发送“选项”而不是 PUT 或 DELETE。

$.ajax({
    url: url,
    type: 'PUT',
    data: "thename="+ $('#TheName').val(),
    success: function(xhr, status) {
        console.info(xhr);
    },
    error: function(xhr, status) {
        console.info(xhr.responseText);
    },
    complete: function(xhr, status) {
        $('#showResponse').val(xhr.responseText);
    }
});

对于某个地方的另一个线程,我已将以下内容添加到 Restler 输出中:

    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS');

PUT/GET/POST/DELETE 在本地主机和跨域上

4

1 回答 1

0

您有正确的响应标头,但您必须让服务器也使用这些标头响应 OPTIONS 请求。

这是一个跨域请求,并且受制于所谓的预检。在发出 PUT 或 DELETE 请求之前,浏览器会询问目标 Web 服务器是否可以安全地从另一个域的网页执行此操作。它要求使用 OPTIONS 方法。除非目标服务器说没问题,否则 Web 浏览器永远不会发出 PUT 或 DELETE 请求。它必须对请求进行预检,因为一旦发出 PUT 或 DELETE,就为时已晚,无法响应响应;敏感信息可能已泄露。

GET 和 POST 有点复杂,因为有时浏览器会在不先询问的情况下确定它们是安全的,而其他时候浏览器也会进行预检检查。这取决于请求中是否使用了某些标头。

CORS 规范有血淋淋的细节。最重要的是,除非目标 Web 服务器支持 OPTIONS 方法,否则您网页上的代码将不允许发出这些请求,并且对 OPTIONS 方法的响应包括表明允许此类请求的标头。

于 2013-01-21T19:19:40.870 回答