即使存在标头,CORS 也会失败

Posted

技术标签:

【中文标题】即使存在标头,CORS 也会失败【英文标题】:CORS failing even when header present 【发布时间】:2015-06-25 14:49:42 【问题描述】:

我正在使用 CORS 请求将数据发布到不同域上的 php 脚本。我收到错误消息:

跨域请求被阻止:同源策略不允许读取 'mydomain' 的远程资源(原因:CORS 标头 'Access-Control-Allow-Origin' 缺失)。

我已经使用以下代码在 php 中设置了标题。

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: OPTIONS, GET, POST");

我也试过这个post中的代码

这是供参考的javascript代码

$.ajax(url, 
    type:"POST",
    dataType:"json",

    data: 
        name:"something"
    ,

    success:function(data, textStatus, jqXHR) 
        alert("success");
    ,

    error: function(jqXHR, textStatus, errorThrown) 
        alert("failure");
    
);

响应标头

Age:1
Cache-Control:max-age=900
Connection:keep-alive
Content-Length:356
Content-Type:text/html; charset=utf-8
Date:Sun, 19 Apr 2015 04:26:27 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

请求标头

Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:14
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
DNT:1
Host:www.jurney.co
Origin:http://isabelinc.in
Pragma:no-cache
Referer:http://isabelinc.in/jurney/testcors.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36 

但我没有运气。 任何帮助表示赞赏

【问题讨论】:

能否添加查询的 HTTP 标头?我想你会首先看到 OPTIONS 请求(响应中需要 CORS 标头),然后 POST 请求(也需要 CORS 标头)。 我已将标题添加到问题中。我在请求中没有看到任何选项,只有一个 POST 我在响应中看不到任何 CORS 标头。当您的浏览器在 isabelinc.in 上并使用 ajax 调用调用 jurney.co 时,jurney.co 必须添加 CORS 标头以告诉浏览器是的,它允许 isabelinc.in(或“*”)这样做。如果您确定headers("Acess-Control...") 在这里,请查找说Warning: Cannot modify header information - headers already sent 的PHP 警告。 我已经检查了所有内容,但我无法确定问题出在哪里。我在 php 文件上看不到任何错误。如果您转到link 并检查网络面板,您可以看到标题。但是您无法在此链接link 上的实际请求中看到它们。我不明白为什么它不发送标头 当我直接或通过 ajax 查询调用 jurney.co 链接时,我看不到标题。我确实看到了 Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319X-Powered-By: ASP.NET :你确定这是正确的 php 服务器吗? 【参考方案1】:

试试这个:

<?php
    // Allow from any origin
    if (isset($_SERVER['HTTP_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']))
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers:        $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']");

        exit(0);
    

    echo "You have CORS!";
?>

【讨论】:

感谢您的回答。我没有办法再测试这个了,所以我真的不知道它是否有效。我最终放弃了这个想法,改用 cURL。再次感谢您的回答

以上是关于即使存在标头,CORS 也会失败的主要内容,如果未能解决你的问题,请参考以下文章

即使 CORS 不允许标头值,Angularjs 也会继续进行服务器调用

即使目录存在,iOS copyItemAtPath 大多数时候也会失败

即使存在所有 CORS 标头,也存在跨源资源共享问题

即使数据库表存在,Delphi TTable.Exists 在 Paradox 表上也会失败

仅当有标头时,Chrome 中的 CORS 请求才会失败

即使服务器的主机密钥存在于 known_hosts 文件中,JSch 连接也会因 UnknownHostKey 而失败