【问题标题】:Vue Axios CORS policy: No 'Access-Control-Allow-Origin'Vue Axios CORS 政策:没有“访问控制允许来源”
【发布时间】:2019-09-16 22:25:26
【问题描述】:

我使用 vue 和 codeigniter 构建了一个应用程序,但是当我尝试获取 api 时遇到问题,我在控制台上收到此错误

Access to XMLHttpRequest at 'http://localhost:8888/project/login' 
from origin 'http://localhost:8080' has been blocked by CORS policy: 
Request header field access-control-allow-origin is not allowed 
by Access-Control-Allow-Headers in preflight response.

我一直在前端(main.js)上这样尝试

axios.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded'
axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';

这个在后端(控制器)

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");

和vue登录方式

this.axios.post('http://localhost:8888/project/login', this.data, {
   headers: {
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Methods": "GET, POST, PATCH, PUT, DELETE, OPTIONS",
          "Access-Control-Allow-Headers": "Origin, Content-Type, X-Auth-Token"
        }
      }).then(res => {
        console.log(res);
      }).catch(err => {
        console.log(err.response);
      });

我已经在stackoverflow中搜索并尝试过,但不起作用,我该如何解决?非常感谢您的帮助

【问题讨论】:

    标签: json vue.js axios


    【解决方案1】:

    CORS 是服务器告诉客户端允许客户端发出什么样的 HTTP 请求。每当您看到 Access-Control-Allow-* 标头时,这些标头应该由服务器而不是客户端发送。服务器“允许”客户端发送某些标头。客户给自己许可是没有意义的。因此,请从您的前端代码中删除这些标头。

    axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';

    this.axios.post('http://localhost:8888/project/login', this.data, {
       headers: {
              // remove headers
            }
          }).then(res => {
            console.log(res);
          }).catch(err => {
            console.log(err.response);
          });
    

    例如,假设您的后端设置了这个 cors 标头。

    header("Access-Control-Allow-Methods: GET");

    这意味着来自不同来源的客户端只允许发送 GET 请求,因此axios.get 可以工作,axios.post 会失败,axios.delete 会失败,等等。

    【讨论】:

    • 错误..我得到了..CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response.
    • 谢谢,+1 说明客户端请求不应包含这些标头。直到现在我才知道。
    【解决方案2】:

    这可能发生在您尝试为 ex 调用另一个主机 - 您的 Vue 应用程序正在 localhost:8080 上运行,但您的后端 API 正在 http://localhost:8888 上运行 在这种情况下 axios 请求寻找这个 localhost:8080/project/login 而不是这个 http://localhost:8888/project/login

    要解决这个问题,你需要在你的 vue 应用中创建代理

    如果你还没有在根文件夹中创建 js 文件 vue.config.js 或 webpack.config.js,请按照此说明创建 js 文件

    然后包括在下面

    module.exports = {
     devServer: {
         proxy: 'https://localhost:8888'
     } }
    

    如果您需要多个后端,请使用以下

    module.exports = {
    devServer: {
        proxy: {
            '/V1': {
                target: 'http://localhost:8888',
                changeOrigin: true,
                pathRewrite: {
                    '^/V1': ''
                }
            },
            '/V2': {
                target: 'https://loclhost:4437',
                changeOrigin: true,
                pathRewrite: {
                    '^/V2': ''
                }
            },
    
        }
    }
    

    如果您选择终点前面的第二个,请使用 V1 或 V2 ex - 在使用 V1/project/login 或 V2/project/login 之前,您的终点是 /project/login 根据主持人

    【讨论】:

    • 谢谢!它完美地工作。我在vue.config.js 文件中的configureWebpack 对象(与publicPath 处于同一级别)中添加了devServer
    • 您好,我已经添加了 devServer,但是当我构建项目时,出现了 cors 错误。并且请求使用http而不是https。
    • 您能否添加一些示例 AJAX 请求,以便我可以通过前缀 /V1 和 /V2 进一步了解这里的用例?
    【解决方案3】:

    就我而言 curl && postman 有效,但 vue axios.post 无效

    从源“http://%%%%.local”访问“http://%%%%:9200/lead/_search”处的 XMLHttpRequest 已被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 access-control-allow-origin .

    所以,问题出在 vue 端而不是服务器端!

    服务器响应包含“access-control-allow-origin: *”标头

    【讨论】:

    • CORS 策略是限制来自浏览器的调用,因此如果您在服务器上设置了 CORS,这意味着您限制了浏览器可以从哪些 URL 向您的服务器发出请求。无论您在服务器上设置什么 CORS,您仍然可以从 Postman 发出请求,因为它不是浏览器。
    【解决方案4】:

    即使服务器端一切正常,我也遇到了同样的问题..

    问题的解决方案是我点击的 API 链接末尾缺少斜线 (/),从而产生了 CORS 错误。

    【讨论】:

    • 这也是我的问题,但如何解决?
    • 你在开玩笑吗?我花了 1 小时试图修复它,但 stackoverflow 周围没有任何东西可以解决我的问题作为您的答案,在 url 末尾添加一个斜杠也解决了我的问题,这怎么能是解决方案?
    【解决方案5】:

    在我的情况下,在我的 php 后端 API 函数中添加它就可以了

            header('Access-Control-Allow-Origin: *');
            header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS, post, get');
            header("Access-Control-Max-Age", "3600");
            header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
            header("Access-Control-Allow-Credentials", "true");
    
    

    【讨论】:

    • 无法添加,我正在从 http localhost 获取 web 服务到 https 服务
    【解决方案6】:

    我正在 Vue.js 中构建一个应用程序,并在 main.js 文件中添加了全局标头

    例子:

    axios.defaults.headers.get['header-name'] = 'value'
    

    【讨论】:

    • 它有效,但需要帮助理解,为什么有效?谢谢
    • 我不完全确定您所说的“为什么”是什么意思。您可以在调用的同一组件/视图上添加标题,也可以在 main.js 文件中添加一些全局标题。如果您有一些不断重复的标题,例如一个授权然后你可以将它添加到 main.js 文件中,它将在整个应用程序中工作:)
    【解决方案7】:

    开发代理是您的解决方案

    使用 DevProxy,您可以定义 Node(服务器运行 vue-cli 开发服务器)将流量路由到的特定路径或通配符(非静态)。

    一旦定义(vue.config.js 中的单个条目),您使用与 UI 相同的 URI(相同的主机和端口)调用您的 api,并且 Vue 将请求重定向到 API 服务器,同时提供正确的 CORS 标头。

    多看https://cli.vuejs.org/config/#devserver-proxy

    【讨论】:

    • 这实际上是仅链接,即实际上没有解释并且现有答案的极其缩短的副本。请让这个答案提供的额外见解更加明显。
    • 感谢您的编辑,现在不再是仅链接的答案。但与现有答案相比,我仍然没有看到这个答案的意义。请指出您提供了哪些额外的见解。让这一点更加明显也会显着增加投票的机会。
    【解决方案8】:

    为了处理 CORS 问题,您现在可能必须在客户端进行更改,这不仅仅是服务器问题。

    Chrome 有几个插件:https://chrome.google.com/webstore/search/cors?hl=en

    【讨论】:

      【解决方案9】:

      你可以试试:

      在后端,

      1. npm install cors

      2. 然后,在后端 app.js 中,添加以下内容,

        const cors = require('cors')

        app.use(cors({ 来源:['http://localhost:8082'], }))

      希望对您有所帮助。

      【讨论】:

        【解决方案10】:

        在某些情况下,这不是 vue 问题。有时是后端问题。在我的情况下,我在 Nest JS 中创建了 API,但我没有启用 CORS = true 。这就是我收到 CORS 策略错误的原因。

        【讨论】:

        猜你喜欢
        • 2020-11-02
        • 2020-11-26
        • 2020-08-23
        • 2020-07-26
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 2019-12-18
        相关资源
        最近更新 更多