javascript - 使用 PHP、AJAX 将数据发布到不同域不起作用

标签 javascript php jquery ajax cors

我想使用 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

最佳答案

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

The origin is a URI indicating the server from which the request initiated. It does not include any path information, but only the server name.

您必须从字符串中删除路径,即它必须是'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;

关于javascript - 使用 PHP、AJAX 将数据发布到不同域不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34958694/

相关文章:

javascript - 如何在 mxgraph 中固定拖动步骤

javascript - Three.js 围绕球体旋转立方体

php - 使用 fopen 和append 创建 PHP 数组

php - 循环遍历 PHP 中的字母表,将字母分组为 A-C、C-E 等范围

php - 如何在 LIMIT 子句中应用 bindValue 方法?

jQuery 将两个 tr 类合并为一个

javascript - Cypress 路由功能未检测到网络请求

javascript - 启用选择列表仅在搜索时可见

javascript - 如何获得下一个 12 :00:00PM in javascript date object

javascript - 在多个 div 中的第一个和最后一个 ul 之后添加元素