Vuex Axios CORS 阻止访问控制允许来源

Posted

技术标签:

【中文标题】Vuex Axios CORS 阻止访问控制允许来源【英文标题】:Vuex Axios CORS Block Acess-control-allow-origin 【发布时间】:2020-04-18 11:27:27 【问题描述】:

这是错误:

所以,我确保我的后端 API 发送 acess-control-allow-origin 标头:

这是我的axios 代码:

     loadTopSales ( commit ) 
       axios
         .get('http://tms.test/api/top-sales', 
           headers: 
             'Access-Control-Allow-Origin': '*',
             Accept: 'application/json',
         Authorization: 'Bearer ' + this.state.token,
             withCredentials: true
           
         )
         .then(items => 
           commit('SET_TOP_SALES', items)
           console.log(items)
         )
         .catch(err => 
           console.log(err)
         )
     

请帮帮我。我已经尝试过***中的每个问题

查看curl -v -x options

我的后端设置标题

 public function handle($request, Closure $next)
    
        $headers = [
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Methods' => 'PUT,POST,GET,OPTIONS,ORIGIN',
            'Access-Control-Allow-Headers' => 'Accept,Authorization,Content-Type,Origin,X-Auth-Token',
            'Access-Control-Allow-Credentials' => 'true',
        ];
        if ($request->getMethod() === "OPTIONS") 
            // The client-side application can set only headers allowed in Access-Control-Allow-Headers
            return Response::make('OK', 200, $headers);
        

        $response = $next($request);
        foreach ($headers as $key => $value)
            $response->header($key, $value);
        
        return $response;
    

这是我在 iis 中配置 CORS 的答案

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept,Authorization" />
        <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, HEAD, OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />
    </customHeaders>
</httpProtocol>

【问题讨论】:

【参考方案1】:

似乎 API 无法处理 CORS preflight requests。它应该为OPTIONS 方法返回Access-Control-Allow-Origin 标头(与Access-Control-Allow-Methods 一起)和204 No Content

您可以通过curl -v -X OPTIONS http://tms.test/api/top-sale查看。

【讨论】:

谢谢!如您所见,所需的标题不存在。 总结:这不是你的前端代码的错,这应该在服务器端解决。 我已经阅读了 CORS 预检请求,但我不明白。 Acess-control-allow-origin:'*'还不够吗? 我设置了我的后端`return $next($request) ->header('Access-Control-Allow-Origin','*') ->header('Access-Control-Allow-Methods ','PUT,POST,GET,OPTIONS,ORIGIN') ->header('Access-Control-Allow-Headers','Accept,Authorization,Content-Type,Origin,X-Auth-Token');`跨度> 当您使用GET HTTP 方法访问您的 API 时,会设置所需的标头。问题是当你用OPTIONS 方法击中它时。正如您在对curl -X OPTIONS 的响应中看到的那样,标头不存在。您能否在您的问题中提供您的服务器端路由的代码 sn-p?【参考方案2】:

您可以尝试使用 http-proxy-middleware 为您的 API 添加代理。请注意,这仅适用于本地开发。

您将获得使用 http-proxy-middleware here 的用户指南。

vueJS具体用法可以试试https://forum.vuejs.org/t/vue-cli-3-how-to-properly-use-http-proxy-middleware/33723

【讨论】:

如果我在本地解决这些问题那我会在网上找到吗? 你可能有。通常,对于生产,我们使用 nginx 反向代理来代理我们的请求。 您在生产中也会遇到同样的问题。如果您的后端无法在本地正确处理它,这些开发代理会为您设置所需的标头,但它们不会出现在生产中。

以上是关于Vuex Axios CORS 阻止访问控制允许来源的主要内容,如果未能解决你的问题,请参考以下文章

本地主机已被 cors 策略请求标头字段内容类型阻止访问控制不允许

访问被 CORS 策略阻止:没有“访问控制允许来源”

已被 CORS 策略阻止:没有“访问控制允许来源”

如何修复“评估已被 CORS 政策阻止:反应中没有“访问控制允许来源”

春季网关请求被 CORS 阻止(无访问控制-允许-来源标头)

Vuex 模块 CORS 错误中的 Nuxtjs Axios