【问题标题】:No 'Access-Control-Allow-Origin' header - Tried all possible solutions没有“Access-Control-Allow-Origin”标头 - 尝试了所有可能的解决方案
【发布时间】:2018-06-24 07:37:38
【问题描述】:

我知道这个问题以前被问过很多次,但我确实尝试了所有方法,但我仍然收到此错误。

我正在尝试通过我的 index.php 文件中的 ajax 获取 json 数据。 我在 ubuntu 服务器上通过 apache2 运行我的网站。我不知道从这里去哪里。

确切错误:

Failed to load http://localhost:32348/getinfo: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.

我尝试了什么: - 将此添加到 /etc/apache2/apache2.conf 文件中

 <ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

- 将此添加到 /etc/apache2/apache2.conf 文件的每个 &lt;Directory&gt; 标记之间:

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

- 将此添加到我的 index.php 文件中:

<?php 
    header('Access-Control-Allow-Origin: *');
 ?>

- 将 'json' 更改为 'jsonp',将 crossDomain 设置为 true 并添加标头以允许来源

function fetchLiveStats() {
        $.ajax({
            url: api + '/getinfo',
            dataType: 'jsonp',
            type: 'GET',
        crossDomain: true,
        headers: {'Access-Control-Allow-Origin': '*'},
            success: function(response) {
                console.log(response);
            },
            cache: 'false'
        }).done(function(data){
            pulseLiveUpdate();
            lastStats = data;
            currentPage.update();
        }).always(function () {
            setTimeout(function() {
                fetchLiveStats();
            }, refreshDelay);
        });
    }

【问题讨论】:

  • 你是否设置了你的 apache 允许的 HTTP 动词?
  • @MikeTung 你是说端口吗?
  • 您的 ajax 选项很荒谬,很可能会导致您的问题。 CORS 比较简单。如果您的请求很简单(没有发送额外的标头,没有 auth cookie 等),您的服务器需要处理的只是请求本身。如果您添加更多标头,例如您添加到选项中的虚假 Access-Control 标头,则浏览器将改为发送预检,这是您的 API 必须正确响应的附加请求。
  • 如果你想使用 CORS 来做这个请求,dataType:'jsonp' 是错误的。你想要json。此外,访问控制标头需要由服务器而不是客户端发送。 “尝试了所有可能的解决方案” 实际上是您问题的一部分。您应该退后一步,了解 CORS 是什么以及 CORS 是如何工作的,然后您将能够过滤掉那些可行的 BS 解决方案。 developer.mozilla.org/en-US/docs/Web/HTTP/CORS 是一个很好的起点。

标签: javascript php ajax apache xmlhttprequest


【解决方案1】:

您需要将 Access-Control-Allow-Origin 标头添加到来自http://localhost:32348/getinfo 的响应中。

我尝试了什么: - 将此添加到 /etc/apache2/apache2.conf 文件中

你所说的关于你的问题的所有其他内容都暗示 Apache 在端口 80 上托管网站,而不是在端口 32348 上的网站。你正在更改错误的服务器。

网站不能授予自己访问其他网站将授予浏览器所有者的数据的权限。


将“json”更改为“jsonp”

不要使用 JSONP。这是一个肮脏的黑客。 (它还要求http://localhost:32348/getinfo 返回 JSONP,这几乎肯定不会)。

将 crossDomain 设置为 true

这只是告诉 jQuery 不要添加它添加到同源请求的标头,以防 HTTP 重定向到不同的源。这可以防止它成为需要预检的复杂请求。由于您一开始并没有请求相同的源 URL,所以这没有任何作用。

添加标题以允许来源

您不能在请求中放置 response 标头!

尝试将其变成需要预检的复杂请求,并导致您遇到更多问题。


您需要编辑负责为http://localhost:32348/getinfo提供服务的任何代码

【讨论】:

    【解决方案2】:

    尝试新更新时不要忘记清空缓存(ipconfig/flushdns)和浏览器缓存,否则可能不会考虑修改...

    【讨论】:

    最近更新 更多