CORS 尝试,php 未修改响应标头

Posted

技术标签:

【中文标题】CORS 尝试,php 未修改响应标头【英文标题】:CORS attempt, php not modifying response headers 【发布时间】:2016-06-12 16:40:21 【问题描述】:

我正在尝试从我的本地服务器到其他在线服务器的自动完成功能,就像测试一样。此服务器在我尝试访问的文件夹中配置了基本身份验证。所以我已经完成了 ajax 函数(我正在使用 JQuery UI 自动完成)并且我已经配置了 php 脚本来返回一个 JSON。在同一台服务器上一切正常。

这就是我所做的:

$(function() 
      $( "#field" ).autocomplete(
        minLength: 1,
        source: function (request, response) 
          console.log(request.term);
          $.ajax(
            type: 'POST',
            url: url,
            data: 
              'idautor': 417,
              'lat': 43.56,
              'lon': -5.96,
              'etiqueta': request.term
            ,
            crossDomain: true,
            dataType: 'json',
            beforeSend: function (xhr) 
              xhr.setRequestHeader ("Authorization", btoa(username + ":" + password));
            ,
            success: function( data ) 
              response( $.map( data["pines"], function( item ) 
                return 
                  value: item["nombre"],
                  label: item["nombre"],
                  idsitio: item["idsitio"],
                  autor: item["autor"]
                
              ));
            
          ).then(function(data) 
            console.log('data', data);
          , 
          function(err) 
            console.log('err', err);
          );
        ,
        select: function (event, ui) 
          alert("El sitio con id "+ui.item.idsitio+" y autor "+ui.item.autor+" ha sido pulsado.");
        
      )
    );  

问题是当我尝试从本地服务器使用它时,基本上是我所说的跨域 HTTP 请求,我在浏览器控制台中收到以下错误:

XMLHttpRequest 无法加载 URL 对预检请求的响应不 通过访问控制检查:没有“Access-Control-Allow-Origin”标头 出现在请求的资源上。原点“http://localhost”是 因此不允许访问。响应的 HTTP 状态码为 401

所以我研究了这个主题,并找到了几个有希望且简单的解决方案来解决我的问题。我试图将标题添加到 php 文件中:

header("Access-Control-Allow-Origin: *"); 
header("Access-Control-Allow-Credentials: true"); 
header("Access-Control-Allow-Methods: GET,POST,OPTIONS");
header("Access-Control-Allow-Headers: accept, authorization, content-type");  

还尝试将它们添加到我的.htaccess 文件中,但完全没有成功。我仍然遇到同样的错误。关于我错过了什么的任何线索?

以防万一和更多信息,这是我发送请求时的 XHR 连接记录,其中我看不到我在 php.ini 中手动添加的新标头。

提前谢谢你。

【问题讨论】:

我的 php 服务器遇到了类似的问题,通过添加以下答案中的代码使其正常工作:***.com/questions/18382740/cors-not-working-php/… Try it out. @noviewpoint 我试过了,还是一样,不知道为什么,但是有些东西拒绝我修改标题或只是覆盖它...... 【参考方案1】:

如果您需要 CORS 凭据,您的 AJAX 请求需要将 withCredentials 设置为 true

Access-Control-Allow-Origin 设置为* 在与Access-Control-Allow-Credentials 结合使用时也不起作用。 You will have to specify the exact domain.

【讨论】:

我已将 xhrFields:withCredentials: true 添加到我的 ajax 函数并将 http://localhost 添加到我的 Access-Control-Allow-Origin 标头,但我仍然得到完全相同的反馈?有没有可能覆盖标题? 我注意到本地开发和任何 AJAX/CORS 的问题,是否可以在在线环境中对其进行测试并反馈? 我已经在没有 cors 的情况下测试了它,只是在同一个服务器上,请求和 json 是完美的,它们工作正常,所以我很好奇,除此之外真正引起我注意的是是 XHR 浏览器报告,我看不到添加的标题,正如您在帖子的图像中看到的那样。 您现在正在使用 CORS 对其进行测试,谷歌搜索提供了足够的结果来解释在本地环境中工作时 CORS 是如何破坏的。这取决于太多可能影响您的代码的因素:浏览器、浏览器版本、xmlhttprequest 与 jQuery。您可以在在线环境中对其进行测试吗? 你的意思是小提琴吗?因为我只有一台服务器... :(

以上是关于CORS 尝试,php 未修改响应标头的主要内容,如果未能解决你的问题,请参考以下文章

尽管端点在 apicontroller 内部的行为中使用了 cors 类,但 CORS 标头未添加到响应中

修改响应标头时,WCF Web 服务未返回正确的状态代码

React + ASP.Net Core 3:CORS 对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头

为啥没有在 CORS 未命中时设置“Vary: Origin”响应?

被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头

节点 JS - CORS 对预检请求的响应未通过访问控制检查:“Access-Control-Allow-Origin”标头的值