Access-Control-Allow-Origin 标头丢失

Posted

技术标签:

【中文标题】Access-Control-Allow-Origin 标头丢失【英文标题】:Access-Control-Allow-Origin header Missing 【发布时间】:2018-10-20 08:51:05 【问题描述】:

我已将此 javascript 包含在其他域中:

var id = "<?php echo check_input($_GET['token']); ?>";
    var querystring = "";
    var lockerurl = "https:\/\/www.example.com\/contentlocker\/getlocker.php?" + 'id=' + encodeURIComponent(id) + '&r=' + encodeURIComponent(referrer) + querystring;


    var iframecontents;
    var old_display;

    function optionstoquery(options) 

        var query = "";

        if (options.mt) query += "&mt=" + encodeURIComponent(options.mt);
        if (options.dt) query += "&dt=" + encodeURIComponent(options.dt);
        if (options.dd) query += "&dd=" + encodeURIComponent(options.dd);
        if (options.md) query += "&md=" + encodeURIComponent(options.md);

        return query;

    

    function og_load(options) 

        if (options) lockerurl += optionstoquery(options);

                        //preload
            var xhr = new XMLHttpRequest();
            xhr.open('GET', lockerurl, true);
            xhr.onreadystatechange = function() 
                if (this.readyState!==4) return;
                if (this.status!==200) 
                    iframecontents = false;
                    return;
                

                iframecontents = this.responseText;
            ;
            xhr.send();

            ogEditBody();
                

控制台显示给我:

跨域请求被阻止:同源策略不允许读取 远程资源在 https://www.example.com/contentlocker/getlocker.php?id=3e066b64a78214a17620b5521b6d3ec4&r=aHR0cDovL2NwYWh1Yi51cy9yb29zdGVyMi5odG1s。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。

getlocker.php 包含一些 php 和 html 代码!

我使用 Plesk 作为网络服务器,并尝试通过添加 getlocker.php:

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

但还是不行!

【问题讨论】:

Access-Control-Allow-Origin: * = 做错了。 The right way 【参考方案1】:

CORS 标头必须在主页请求中发送,因此如果您在发送嵌入式脚本时仅设置它是不够的。

【讨论】:

【参考方案2】:

这是您的 PHP 文件中的第一行吗?

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

另外,请尝试在您的 AJAX 调用或 HTTPRequest 中发送 crossDomain: true

【讨论】:

是的,这是第一行。如何添加 crossDomain: true ?【参考方案3】:

在服务器端,在 Linux 服务器上,您可以在 Web 服务器配置中设置所需的标头:

对于 Plesk 中的源域 example.com,请转到 Domains &gt; example.com &gt; Apache and nginx settings 并在 Additional directives for HTTPAdditional directives for HTTPS 中添加以下指令:

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

或者,在这种情况下,可以使用具有以下内容的.htaccess 文件:

<IfModule mod_headers.c>p
Header always set Access-Control-Allow-Origin "*"
</IfModule>

如果启用了 Nginx 并且需要显示静态内容,请在不使用 Apache 指令的 Additional nginx directives 字段中使用以下指令:

add_header Access-Control-Allow-Origin "*";

【讨论】:

我在Additional nginx directives 中添加了add_header Access-Control-Allow-Origin "*";,但仍然显示同样的错误!

以上是关于Access-Control-Allow-Origin 标头丢失的主要内容,如果未能解决你的问题,请参考以下文章

PHP没有按顺序执行

跨域请求被阻止 Symfony/AngularJS

C# MVC js 跨域

PHP Ajax 跨域问题最佳解决方案

PHP Ajax 跨域问题最佳解决方案

PHP Ajax 跨域问题最佳解决方案