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 与此有关。
所以我得到了这个加载了一堆数据的页面,所以我正在使用无限滚动。客户端 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 与此有关。