CORS 标头“Access-Control-Allow-Origin”缺少 Laravel 5.4

Posted

技术标签:

【中文标题】CORS 标头“Access-Control-Allow-Origin”缺少 Laravel 5.4【英文标题】:CORS header ‘Access-Control-Allow-Origin’ missing Laravel 5.4 【发布时间】:2018-02-08 22:53:56 【问题描述】:

我对使用 javascript 的 CORS 有疑问。

跨域请求被阻止:同源策略不允许读取 http://openexchangerates.org/latest.json 的远程资源。 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。

为了解决这个问题,我安装了laravel-cors 包

但这根本没有帮助。有人可以建议我如何解决这个问题吗?我如何调试它以查看问题出在哪里以及为什么这个包不起作用?

这是我的代码。

\Http\Kernel.php

protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \Barryvdh\Cors\HandleCors::class,
    ];

\config\app.php

'providers' => [
       Barryvdh\Cors\ServiceProvider::class,
 ],

\config\cors.php

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Laravel CORS
    |--------------------------------------------------------------------------
    |
    | allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
    | to accept any value.
    |
    */

    'supportsCredentials' => false,
    'allowedOrigins' => ['*'],
    'allowedHeaders' => ['*'],
    'allowedMethods' => ['*'],
    'exposedHeaders' => [],
    'maxAge' => 0,

];

结束我的 js:

$(document).ready(function()
    fx.base = "EUR";
    fx.settings = 
        from : "EUR"
    ;

    var amount = 9.99; //in SolidShops, you could use:  product.price 
    // Load exchange rates data via the cross-domain/AJAX proxy:

    $.getJSON(
        'http://openexchangerates.org/latest.json',
        function(data) 
            // Check money.js has finished loading:
            if ( typeof fx !== "undefined" && fx.rates ) 
                fx.rates = data.rates;
                fx.base = data.base;
             else 
                // If not, apply to fxSetup global:
                var fxSetup = 
                    rates : data.rates,
                    base : data.base
                
            

            // now that we have exchange rates, add a few to our page
            var USD = fx.convert(amount, to: "USD"); //13.22784197768393
            var GBP = fx.convert(amount, to: "GBP"); //8.567532636985659
            var JPY = fx.convert(amount, to: "JPY"); //1028.1670562349989

            // we can now use the accounting.js library to format the numbers properly
            USD = accounting.formatMoney(USD, "$ ", 2, ",", ".");
            GBP = accounting.formatMoney(GBP, "£ ", 2, ",", ".");
            JPY = accounting.formatMoney(JPY, "¥ ", 2, ",", ".");

            $("ul.currencies").append("<li>USD estimate: " + USD + "</li>");
            $("ul.currencies").append("<li>GBP estimate: " + GBP + "</li>");
            $("ul.currencies").append("<li>JPY estimate: " + JPY + "</li>");
        
    );
);

【问题讨论】:

我在 Laravel 上工作已经有一段时间了,但你可以参考像 github.com/francescomalatesta/laravel-api-boilerplate-jwt 这样的包来了解你做错了什么 @JackSlayer94 这是一个全新的项目,我怎么理解? 【参考方案1】:

您需要改用 URL https://openexchangerates.org/api/latest.json


问题中引用的错误消息表明,当您的代码向 URL http://openexchangerates.org/latest.json 发出请求时,openexchangerates.org 服务器没有将 Access-Control-Allow-Origin 响应标头发送回您的代码。

因此,您在自己的服务器后端执行什么 CORS 配置并不重要,您自己的代码是从该后端提供的。您遇到的问题只是因为 openexchangerates.org 没有发回 Access-Control-Allow-Origin 响应标头。

但是,如果您改为使用正确的 URL —https://openexchangerates.org/api/latest.json — 那么该服务器将在其响应中发回 Access-Control-Allow-Origin 标头,而您将不会收到 “CORS 标头 'Access-Control-Allow -Origin'missing” 错误消息不再出现。

【讨论】:

谢谢,我是新手。我在一个过时的教程中得到这个代码。

以上是关于CORS 标头“Access-Control-Allow-Origin”缺少 Laravel 5.4的主要内容,如果未能解决你的问题,请参考以下文章

CORS - 从 Postman 伪造 CORS 预检无法返回标头

带有 PHP 标头的跨域请求标头 (CORS)

CORS 多个标头

未设置 CORS 标头

当请求标头具有 CloudFront + S3 网站的“接受编码”时,CORS 标头丢失

JQuery、CORS 和自定义响应标头