Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我没有得到';访问控制允许原点';经过无数次的脚本工作_Javascript_Php_Jquery_Ajax_Cors - Fatal编程技术网

Javascript 我没有得到';访问控制允许原点';经过无数次的脚本工作

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

我正在用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");
我在主网站上的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');
}