【问题标题】:Posting data to different domain using PHP, AJAX don't work使用 PHP 将数据发布到不同的域,AJAX 不起作用
【发布时间】:2016-04-29 18:15:47
【问题描述】:

我想使用 AJAX 将数据从 domain1.com 发布到 domain2.com,但我的请求失败。

这是我在domain1.com 上的代码:

$.ajax({
    type: 'POST',
    url: 'https://domain2.com/payment/api/server',
    crossDomain: true,
    data: {
            Name: $("#name").val().trim(), 
            Email: $("#email").val().trim()
          },
    dataType: 'json',
    success: function(data) {
        alert('Success');
    },
    error: function (data) {
        alert('POST failed.');
    }
});

这是我在domain2.com 上的服务器端代码:

switch ($_SERVER['HTTP_ORIGIN']) {
  case 'http://domain1.com/api/': case 'http://domain1.com/api/':
    header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
  break;
}

$name = $_POST['Name'];

echo $name; // Just to check if I receive the value from index.php

【问题讨论】:

  • 副本上的答案已过时。现在我们有 CORS:stackoverflow.com/questions/10636611/…
  • *标记为重新打开。 OP 询问使用 CORS 的跨域发布。另一个问题和选择的答案没有提到 CORS。
  • @Jasny-ArnoldDaniels 给定的代码有什么问题吗?请指教。

标签: javascript php jquery ajax cors


【解决方案1】:

您正在检查 Origin HTTP 标头是否等于 'http://domain1.com/api/'。但是,MDN CORS docs 说:

origin 是一个 URI,指示发起请求的服务器。它不包含任何路径信息,只包含服务器名称。

您必须从字符串中删除路径,即它必须是'http://domain1.com'

更正server.php代码:

switch ($_SERVER['HTTP_ORIGIN']) {
  case 'http://domain1.com':
    header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
  break;
}

$name = $_POST['Name'];

echo $name;

【讨论】:

    【解决方案2】:

    附带说明:如果您使用“HTTP_ORIGIN”标头来“保护”您的请求,您应该重新考虑它。任何人都可以欺骗此标头并任意设置值。你最好使用某种密钥/秘密来避免不需要的请求。见:Is CORS a secure way to do cross-domain AJAX requests?

    【讨论】:

    • 您不能使用 XMLHttpRequest 或 Fetch API 来欺骗 Origin 标头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多