【问题标题】:CORS not working phpCORS 不工作 php
【发布时间】:2013-08-25 07:39:42
【问题描述】:

我正在尝试通过 CORS 将表单数据从 www.siteone.com 发布到 www.sitetwo.com。我的ajax代码是这样的:

<script>
$(document).ready(function(){
        $("#submit").live('click',function() {
            var url = "http://www.sitetwo.com/cors.php";
            var data = $('#form').serialize();
            jQuery.ajax({
                url : url,
                type: "POST",
                data : $('#form').serialize(),
                }).done(function(response){
                    alert(response);
                    }).fail(function(error){
                    console.log(error.statusText);
                    });
                return false;


});
});
</script>

www.sitetwo.com中的cors.php文件如下:

<?php
 header('Access-Control-Allow-Origin: *');
 header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
 echo "hai";
?>

但仍然抛出 Access-control-Allow-Origin 错误。 抛出的错误是这样的:

XMLHttpRequest cannot load http://www.sitetwo.com/cors.php. Origin http://www.siteone.com is not allowed by Access-Control-Allow-Origin. 

我知道,使用 CORS 只需通过标头允许远程网站,我们就可以使用跨域请求。但是当我这样尝试时,会抛出错误。我在这里错过了什么吗? 这是我的请求/响应标头:

Response Headers
Connection  Keep-Alive
Content-Length  487
Content-Type    text/html; charset=iso-8859-1
Date    Fri, 23 Aug 2013 05:53:20 GMT
Keep-Alive  timeout=15, max=99
Server  Apache/2.2.15 (CentOS)
WWW-Authenticate    Basic realm="Site two Server - Restricted Area"
Request Headers
Accept  */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Content-Length  43
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    www.sitetwo.com
Origin  http://www.siteone.com
Referer http://www.siteone.com/index.html
User-Agent  Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0

【问题讨论】:

  • $_SERVER['HTTP_ORIGIN'] 有什么价值?你认为它应该有什么价值?注意HTTP_ORIGIN isn't mentioned in the documentation for $_SERVER
  • 我什至试过 header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST, GET, OPTIONS');但它没有用。
  • 1.) 我不知道您遇到了什么具体问题。你需要澄清这一点。 2.) 与往常一样,对于这些类型的问题,请显示您的请求和响应标头。
  • $=jQuery.noConflict() 看起来不对。您告诉 jQuery 将 $ 恢复为原始值,然后将其设置回 jQuery。似乎有点无意义。
  • 仍在等待请求/响应标头。

标签: php jquery cross-domain cors access-control


【解决方案1】:

最后,我自己解决了问题中解释的问题。我为访问标头而实现的代码不正确。

下面提到的两行代码,当给出时,不起作用:

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
?>

但是正确处理 CORS 请求需要更多的参与。这是一个响应更全面的函数。更新后的代码是这样的:

 <?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!";
?>

我从另一个post找到的 成功了……

【讨论】:

  • @mplungjan 可能是因为其他页面中普遍存在的答案而被否决了。但我已经解决了我的问题,并在参考其他帖子的长时间分析后找到了答案。它仍然不受社区欢迎..
  • @mplungjan 我在发布此问题一天后才发布答案。 CORS 之前对我没有用。在网络的任何地方,您只能找到问题中的两行标题代码(php 文件)。我们应该添加更多内容以启用它。无论如何,我只有在它工作后才发布我的答案。
  • 我敢打赌这是因为 Access-Control-Allow-Origin: * 非常、非常、非常不安全
  • 我同意“Access-Control-Allow-Origin: *”是不安全的,但在锁定之前先验证功能很重要。在您启动并运行之后,请大家锁定 Access-Control-Allow-Origin! :)
  • 我在使用 Access-Control-Allow-Origin 时遇到了 Firefox 的问题:* 似乎 FF 希望响应标头中的实际来源不是通配符,即使 CORS 和 Mozilla 声明它应该处理 GET 请求。
【解决方案2】:

允许所有人使用 CORS:

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');

echo "You have CORS!";

【讨论】:

    【解决方案3】:

    另一个原因是,如果您在 php 中缺少分号或其他内容,则即使错误报告已打开,CORS 错误消息将是 ajax 显示的唯一错误,而您可以看到实际错误通过转到浏览器中的 php url。

    【讨论】:

    • 非常感谢!不知道为什么,但我一直在服务器错误文件中丢失有关我的 PHP 代码中缺少“)”的日志,并且我一直在控制台中收到该 CORS 错误。
    【解决方案4】:

    请求可能失败的另一个原因是您的请求是否指向以斜杠结尾或不以斜杠结尾的 URL。例如,在我的情况下,我必须以 domain.com/api/ 为目标,因为 domain.com/api(无斜杠)无效并生成了缺少标头错误。

    如果您在浏览器中测试此 URL,它会自动更正,您会认为该 URL 有效,但请求会失败。结尾处的这一斜线非常微妙且容易忽略。

    【讨论】:

    • 推测:这可能与我的 htaccess 中由插件添加的东西有关,强制尾部斜杠,显然 JavaScript 无法弥补。
    猜你喜欢
    • 2017-08-19
    • 2017-07-14
    • 2018-06-01
    • 2013-11-14
    • 2018-09-28
    • 2016-04-18
    • 2018-07-13
    • 2016-06-08
    • 2017-09-19
    相关资源
    最近更新 更多