【问题标题】:How do I enable cross-origin resource sharing on XAMPP?如何在 XAMPP 上启用跨域资源共享?
【发布时间】:2016-04-24 16:31:24
【问题描述】:

我的本​​地主机上有一个 html 文件,其中包含一个表单和处理发布数据的 jquery/ajax。一个简单的 php 脚本在 mysql 数据库表中查找数据

这是主要部分:

// $.post('lookup_update.php', $(this).serialize()) //<- local part which works
   $.post('http://www.example.com/projectX/lookup_update.php', $(this).serialize()).done(function (data)
                            { etc.

但是当我指向在线 lookup_update.php 时,我在 chrome 中收到以下错误消息

XMLHttpRequest 无法加载 http://www.example.com/projectX/lookup_update.php。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost' 不允许访问。响应的 HTTP 状态代码为 404。

据我了解,我需要使用

 header("Access-Control-Allow-Origin: *");

对于 php。但是当我将它添加到 example.com/lookup_update.php 时,当 localhost 文件尝试调用它时,该文件会给出 404。

我还尝试将以下内容添加到我的 Xampp apache 配置文件中

Header set Access-Control-Allow-Origin "*"

如何从我的本地 XAMPP 设置中正确启用跨域资源??

[编辑] 这是我在本地主机上的简单表单

<!--Begin form-->
    <div id="form" class="result">
        <form method="post" id="reg-form"  class="form-horizontal">
            <div class="controls">
                <input type="text" name="code" id="code" placeholder="Code"  class="form-control input-lg" />      
            </div>
        </form>
    </div>
    <!--End form-->

用下面的表单jquery代码

    <script type="text/javascript">
            $(document).ready(function ()
            {
                $(document).on('submit', '#reg-form', function ()
                {
                    var tmpCode = $("#code").val();

//                    $.post('lookup_update.php', $(this).serialize())
                      $.post('http://www.example.com/projectX/lookup_update.php', $(this).serialize())
                            .done(function (data)
                            {

                                $("#reg-form").fadeOut('slow', function ()
                                {
                                    $(".result").fadeIn('slow', function ()
                                    {
                                        console.log("inner test " + tmpCode);
                                        $(".result").html(data);


                                        setTimeout(function () {
                                            location.reload();
                                            $('input').val("");
                                        }, 3000);


                                    });
                                });
                            })
                            .fail(function ()
                            {
                                alert('fail to submit the data');
                            });
                    return false;
                });


            });

        </script>

[编辑 2]

好的,我认为这与在线lookup_update.php 文件无关,因为我正在使用它在另一个文件中进行测试

            var testXHR = $.post("http://www.example.com/projectX/lookup_update.php", function (data) {
            alert("success:" + data);
        })

在警报弹出窗口中,我看到了预期的数据

【问题讨论】:

  • 问题中的 URL 相当混乱。是http://www.example.com/projectX/lookup_update.phpexample.com/lookup_update.php,还是http://www.example.com/projectX/index.php
  • @AlexBlex 我的意思是同一个文件,我将 index.php 重命名为 lookup_update.php。正是这个在线文件,我喜欢在本地调用它
  • 您能否使用正确的文件名更新问题、添加header 的代码的sn-p 以及命令curl -v http://www.example.com/_correct_url_here -o /dev/null 的输出

标签: php apache cross-domain config


【解决方案1】:

您必须在 lookup_update.php 的开头编写以下代码

header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');

你可以只写IP地址而不是*。

首先你必须检查本地主机或其他服务器上的问题。

试试这个代码:如果你在警报中得到一些数据,那么问题出在其他服务器上的本地主机上。

$.post( "test.php", function( data ) {
alert( "Data Loaded: " + data );
});

【讨论】:

  • 听起来很有希望,但是当我从本地主机调用时,我应该使用当前位置的 IP 地址吗?我的意思是当我把我的电脑带到另一个地方时,我会得到另一个 IP 地址,对吗?哦,顺便说一句,让我吃惊的是,当我用谷歌搜索“我当前的 ip”时,我得到 2001:980:cb55:1:xxx:xxxx::25c9 是每台计算机的 IP,我也可以使用这个吗?哦,这是IPv6而不是旧的xxx.xxx.xxx.xx???
  • 如果您从不同的服务器获取数据,那么您可以使用 IP 地址。在本地主机上不需要。
  • 我在 example.com/projectX/lookup_update.php 的开头尝试了header("Access-Control-Allow-Origin: 2001:980:xxxx:1:ec29:xxxx:fe4c:25c9");,但仍然收到警告
  • 首先让我澄清一件事。您正在从本地主机调用 ajax 并从不同的服务器(不是本地主机)获得响应?
  • 是的ajax调用来自本地主机$.post('http://www.example.com/projectX/lookup_update.php', $(this).serialize()) .done(function (data)和在线lookup_update.php echo json格式数据
【解决方案2】:

CORS 请求通过 preflight 请求得到“保护”。

MDN 谈论它here

此外,对于可能对用户数据造成副作用的 HTTP 请求方法(特别是对于 GET 以外的 HTTP 方法,或者对于某些 MIME 类型的 POST 使用),规范要求浏览器“预检”请求,使用 HTTP OPTIONS 请求方法从服务器请求支持的方法,然后在服务器“批准”后,使用实际 HTTP 请求方法发送实际请求

这只是一个猜测,但您可能正在使用一个框架,并且您忘记为您的请求启用(实现)OPTIONS 路由。

值得注意的是,您不应使用通配符标头(允许任何站点对您的服务进行 CORS),而应指定白名单。

您应该发送的另一个标头是允许的请求方法。

Access-Control-Request-Method: POST

希望这会有所帮助。

【讨论】:

  • 不,不使用框架。只需一个简单的 1 输入字段表单和一些 jQuery javscript 即可发布和处理响应。
  • 在这种情况下,请仔细检查您的路由。您可能根本没有达到您的脚本。我还编辑了提到要发送的另一个标题的答案。无论如何,请阅读该 MDN 文章以更广泛地了解此问题
  • 啊我看到lookup_update.php确实使用了一个框架(Wordpress)
  • 如果它有助于解决您的问题,也许您可​​以接受我的回答。如果您在实施解决方案时遇到问题,请随时就该特定问题提出新问题。干杯
  • 尚未解决,重新创建了lookup_update.php,因此它不使用Wordpress 函数。仍然需要深入了解您的链接并阅读
【解决方案3】:

如果您想在 httpd.conf 文件中允许 CORS,这对我有用:

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Header set Access-Control-Allow-Headers "X-Requested-With, Content-Type, X-Token-Auth, Authorization"

将其放在httpd.conf 文件中的Listen 80 行下方。

当我只使用 Header set Access-Control-Allow-Origin "*" 时,GET 请求有效,但 POST 没有。

它被测试的环境是使用 XAMPP 的 Apache 服务器上的 Windows 10。 Apache 正在托管一个 Laravel 项目。

【讨论】:

    【解决方案4】:

    这段代码救了我:

    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
    Header set Access-Control-Allow-Headers "X-Requested-With, Content-Type, X-Token-Auth, Authorization"
    

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 2016-05-31
      • 2011-05-07
      • 2016-02-06
      • 2013-01-12
      • 2012-06-26
      相关资源
      最近更新 更多