Javascript 我没有得到';访问控制允许原点';经过无数次的脚本工作
我正在用php在服务器的后台构建一个小api。我正在使用api.website.com的子域。 只是为了调试,我在子域中index.php的索引上有这个Javascript 我没有得到';访问控制允许原点';经过无数次的脚本工作,javascript,php,jquery,ajax,cors,Javascript,Php,Jquery,Ajax,Cors,我正在用php在服务器的后台构建一个小api。我正在使用api.website.com的子域。 只是为了调试,我在子域中index.php的索引上有这个 header("Access-Control-Allow-Origin: *"); header('Access-Control-Allow-Credentials: true'); header("Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE"); 我在主网站上的javas
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Credentials: true');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE");
我在主网站上的javascript代码是
$.ajax({
xhrFields: {
withCredentials: true
},
headers: {
"X-My-Custom-Header": "some value"
},
url: 'https://api.website.com/',
type: 'GET',
processData: false,
contentType: "application/json",
dataType: 'json',
data: '{}',
success: function(r) {
console.log(r);
},
error: function(r) {}
});
这一切都很好,直到昨天,今天我开始工作时,我得到了这个
对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。因此,不允许源“”访问
我觉得很奇怪,昨天一切正常,现在我不知道发生了什么 某些时候,当从服务器缓存提供页面时,访问控制允许源标题丢失,请确保该页面不是从缓存提供的,或者确保缓存stting包含此标题。您不能使用带有凭据的
和通配符源。否则,这就是安全风险。请参阅:好的,我不知道我是如何解决这个问题的,但我猜就像上面的评论所说的,标题正在缓存中。
我正在使用cloudflare重新启动ssl,因为它喜欢缓存所有内容。
现在,为了让它工作,我必须从javascript中删除这两件事
headers: {"X-My-Custom-Header": "some value"},
及
从我所有的ajax调用中
正如我提到的通配符,我只是出于测试目的使用它,只是为了看看是否是我的动态php代码引起了问题。谢天谢地,事实并非如此
function cors() {
$domain = ltrim($_SERVER['HTTP_HOST'], "api.");
$origin = $_SERVER['HTTP_ORIGIN'];
if (preg_match("/^http[s]?[:]\/\/(w{3})?[.a-zA-Z ]*".$domain."$/i", $origin)) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
// may also be using PUT, PATCH, HEAD etc
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
exit(0);
}
header('Content-Type: application/json');
header('Accept: application/json');
}
这是在cors()开头调用的;不会造成任何收割台和大陆交叉污染
谢谢你的建议,我需要一些想法来集思广益解决问题
更新:
我以为cloudflare搞乱了标题
但看起来可能不是他们,即使清除了他们帮助过的缓存。
然后我陷入了另一个问题,POST和GET工作得很好,但没有删除和选项之类的功能。
因此,在仔细分析和研究之后,我发现PHP中的header()不起作用。
结果是
因为速度
我必须暂时修复.htaccess上的标题。
我的意思是PHP标题可以工作,但由于一些奇怪的原因,我在postman程序标题中看到的内容在AJAX中并不一致。问题在于PHP,而不是JS。如果您收到该错误,则CORS头未正确应用,或者位于代码的错误部分。你需要调试为什么会这样。从昨天起发生了什么变化?我正在修改另一个代码,让ajax动态加载其他html页面作为modals插件,但这不应该做任何事情,因为它不是子域。如果我从简单的开始,比如说,我在子域中创建了一个名为bob.php的新php,在调用域中使用了一个标题,并使用ajax I seam对其进行引用,但仍然会得到相同的错误哦,是的,在发送设置setRequestHeader(“缓存控制”,“无缓存”)之前我正在使用ajax;和setRequestHeader(“Pragma”,“无缓存”);老实说,我有一个函数,所以我不必使用通配符。称为cors,动态地使其成为标头(“访问控制允许来源:);。当我开始调试时遇到问题时,我添加了通配符。嗯,可能是安静,我正在使用cloudflare,你认为它会干扰标头导致问题吗?我不熟悉cloudflare,我使用的第三方缓存有这个问题
function cors() {
$domain = ltrim($_SERVER['HTTP_HOST'], "api.");
$origin = $_SERVER['HTTP_ORIGIN'];
if (preg_match("/^http[s]?[:]\/\/(w{3})?[.a-zA-Z ]*".$domain."$/i", $origin)) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
// may also be using PUT, PATCH, HEAD etc
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
exit(0);
}
header('Content-Type: application/json');
header('Accept: application/json');
}