AJAX (jQuery) 到 PHP, 'Access-Control-Allow-Origin' header 包含多个值'<domain>, *',但只允许一个

AJAX (jQuery) to PHP, 'Access-Control-Allow-Origin' header contains multiple values '<domain>, *', but only one is allowed

所以我得到了这个加载了一堆数据的页面,所以我正在使用无限滚动。客户端 html 使用 jQuery 对服务器上的 PHP 文件执行 AJAX 请求。

该页面与服务器位于不同的域中,这就是为什么需要 access-control-headers / allow-origin 的原因。

我没有测试它,它确实给出了以下错误:

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers in preflight response.

现在,当我在 PHP 文件中添加 headers 时,我得到:

Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values 'domain, *', but only one is allowed. Origin 'domain' is therefore not allowed access.

Server-side PHP:

header('Access-Control-Allow-Origin: https://di.community');
header('Access-Control-Allow-Headers: X-Requested-With');    
$start = $_GET['start'];
echo json_encode(array_slice($tokenData, $start, 500));

客户端:

$.ajax({
    if (working == false) {
        working = true;
        type: "GET",
        url: "serverdomain/data.php?start="+start,
        processData: false,
        contentType: "application/json",
        data: '',
        success: function(r) {
            r = JSON.parse(r)
            start += 500;
            setTimeout(function() {
                working = false;
            }, 100)
        },
        error: function(r) {
            console.log("Something went wrong!");
        }
    }
});

我已将客户端域名编辑为"domain"。我只希望那个特定的域能够访问,这就是为什么我不使用 *.我已将服务器域编辑为 "serverdomain"。

是的,只要用户滚动到页面底部,这个 AJAX 就会触发,这是有效的。但出于某种原因,当我添加 headers 时,它认为我为 Allow-Origin header 设置了多个值。同样,这两个错误之间的唯一区别是将以下内容添加到 php 脚本中:

header('Access-Control-Allow-Origin: https://di.community');
header('Access-Control-Allow-Headers: X-Requested-With');

如果有人能指出我为什么会发生这种情况的方向,我将非常感激 :P。

编辑:我检查了可能的重复项。这不是同一个问题,但它的最佳答案建议使用 .htaccess 来获得想要的结果,这导致我检查 .htaccess 以查看它是否与我的多值错误有关并且确实如此。 :) 现在修复了,谢谢 Nico

感谢 Nico Haase 的评论,我查看了包含以下几行的 .htaccess:

<FilesMatch "\.(php)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch> 

这解释了错误。删除它并不明智,它与 wordpress 相关,我觉得我可能会破坏一些需要它的东西。

所以我现在所做的是在 PHP 中进行设置:

header('Access-Control-Allow-Headers: X-Requested-With, Content-Type');
header('Access-Control-Content-Type: application/json');

这会触发 .htaccess 中添加 Allow-Origin header 的东西。

现在可以使用了!愚蠢的我没有想到 .htaccess 与此有关。