Cors Ajax 请求适用于子域但不适用于主域

Posted

技术标签:

【中文标题】Cors Ajax 请求适用于子域但不适用于主域【英文标题】:Cors Ajax request works on subdomain but not on main domain 【发布时间】:2018-08-10 15:37:41 【问题描述】:

我在一个名为 backend.example.com 的子域上使用 laravel 编写了一个 API。如果我尝试从另一个名为 partner.example.com 的子域从我的 API 获取信息,我可以毫无问题地验证自己并获取这些信息。这是 Ajax 请求:

但是,如果我尝试对名为 example.com 的主域执行完全相同的操作,则会收到此错误:

无法加载https://backend.example.com/api/v1/leads/showAdmin: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。 Origin 'https://example.com' 因此不允许访问。

这是主域的 Ajax:

    var ajaxArray = 
        "fromDate": from,
        "toDate": to
        ;

    console.log(ajaxArray);

    jQuery.ajax(
        url: ("https://backend.example.com/api/v1/leads/showAdmin"), 
        type: "POST",
        data: ajaxArray,
        crossDomain: true,
        headers : 
        "Authorization": "Basic " + btoa("api@example.com" + ":" + "123456"), 
        "Accept": "application/json"
        ,
        error: function()  alert("Error"); ,
        success: function(result)
            alert("Working");
        );
    );

这是我来自 wokring 子域的 Ajax 请求:

    var ajaxArray = 
        "fromDate": from,
        "toDate": to,
        "table": "no",
        "userID": 20
    ;

console.log(ajaxArray);

jQuery.ajax(
    url: ("https://backend.example.com/api/v1/leads/show"), 
    type: "POST",
    data: ajaxArray,
    crossDomain: true,
    headers : 
    "Authorization": "Basic " + btoa("api@example.com" + ":" + "123456"), 
    "Accept": "application/json"
    ,
    error: function()  alert("No"); ,
    success: function(result)
        alert("Working");
    );
);

但我不明白,因为我已经允许所有...... 见这里:

<?php

return [

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

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

];

不胜感激任何形式的帮助! 亲切的问候

【问题讨论】:

【参考方案1】:

没有插件试过吗?添加标头就足够了,只是为了看看它是否有效,您可以尝试修改路由上的返回响应,即

use Illuminate\Http\JsonResponse;

Route::get("/whatever", function() 
    $response = new JsonResponse(['arr','ay']);  
    $response->header("Access-Control-Allow-Origin", "http://localhost:3000");
    return $response;

你使用的是哪个版本的 Laravel?

【讨论】:

以上是关于Cors Ajax 请求适用于子域但不适用于主域的主要内容,如果未能解决你的问题,请参考以下文章

对外部 API 的 HTTP 请求适用于 .NET,但不适用于 React(CORS 问题)

CORS 适用于 chrome 但不适用于 firefox、angularjs

多个 CORS 适用于 GET 但不适用于 PUT/POST 与飞行前请求 Web api 2

为啥 CORS 适用于 API 请求,但不适用于我的 Nginx 配置中的媒体文件(例如 mp4、webm)?

Spring Boot - CORS 过滤器适用于 GET,但不适用于其他 HTTP 动词

使用 CORS 与 LocomotiveJs 一起休息 API。适用于本地机器,但不适用于 Amazon 或 Heroku