【问题标题】:Post request to api blocked by CORS policy将请求发布到被 CORS 策略阻止的 api
【发布时间】:2019-09-30 19:50:32
【问题描述】:

我正在使用 Vue.js 制作一个网络应用程序,在这个网络应用程序中,人们必须登录才能接收 API 密钥。我正在使用 axios 向我的 API 发出一个发布请求,我还发送了 2 个参数,一个名称和一个密码。每当我提交表单时,它总是给我这些错误:

OPTIONS http://localhost/Leerjaar%203/api/apikey/ 500 (Internal Server Error)

Access to XMLHttpRequest at 'http://localhost/Leerjaar%203/api/apikey/' from origin 'http://localhost:8082' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

我已经被这个问题困扰了几个月了,几个月前我停止了尝试,但今天我决定回到它并再试一次。我已经尝试在我的 PHP 文件中设置标题,但这似乎也不起作用。

发出post请求的方法:

formSubmit(e) {
            e.preventDefault();
            let currentObj = this;
            axios.post('http://localhost/Leerjaar%203/api/apikey/', {
                docent: this.docentNaam,
                wachtwoord: this.wachtwoord
            })
            .then(function (response) {
                currentObj.output = response.data;
                console.log(response.data);
            })
            .catch(function (error) {

            }); 
        }

我的 PHP API:

<?php    
session_start();
include "../errors.inc.php";
include "../credentials.inc.php";
include "../database.inc.php";

$docent = Docent();

if (!isset($_POST["wachtwoord"]))    fout(400, "wachtwoord ontbreekt");
if ($_POST["wachtwoord"] !== "test") fout(401, "wachtwoord incorrect");


header('Access-Control-Allow-Origin: http://http://localhost:8081/', false);     
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
header('content-type: application/json; charset=utf-8');
echo '{"apikey":"'.md5(md5($docent)).'"}';   

我的表格:

<form @submit="formSubmit">
                            <div class="form-group">
                                <label for="docentNaam">Naam:</label>
                                <input v-model="docentNaam" type="text" class="form-control" placeholder="Docenten afkorting">

                                <label for="wachtwoord">Wachtwoord</label>
                                <input v-model="wachtwoord" type="password" class="form-control" placeholder="Wachtwoord">

                                 <button type="submit" class="btn btn-primary">Submit</button>
                            </div>
                        </form>

这是我返回的标题:

我希望有人可以帮助我解决我的问题,我觉得我已经尝试了一切。

【问题讨论】:

  • 避免 CORS 的最好方法是不要有 CORS(是的,我知道,你想扇我耳光)。我处理它的方式是使用 nginx 将所有一起玩的域放在同一个名称下。这意味着我使用http://local.dev 为JS 和PHP 提供服务(local.dev 是一个假名,我使用/etc/hosts 文件路由到127.0.0.1,在Windows 上它位于C:\Windows\System32\drivers\etc 中)。在网络服务器配置(我使用 nginx)中,我尝试加载资源@第一台服务器(在你的情况下为:8082),然后回退到 php。它就像一个魅力,不 - 你还没有尝试过一切! :)
  • OPTIONS 请求导致您向其发送请求的服务器(即您的 API 服务器)发生 500 内部服务器故障。该 500 错误是您需要修复的问题,其原因与您在 API 服务器上的 CORS 配置无关。所以CORS错误实际上是无关紧要的。您需要查看 API 服务器上的服务器日志,看看服务器发生了什么内部故障,导致它最终响应 500 错误。

标签: php http vue.js axios


【解决方案1】:

CORS 是“跨源资源共享”,参见https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests。基本上,它是由您的浏览器强制执行的。如果浏览器阻止了跨域请求,你有一些选择:

  • 使其不是跨源请求(通过将所有内容托管在同一主机和端口上)

  • 满足“简单请求”的条件,让浏览器让HTTP请求通过

  • 在托管 POST 表单的任何对象上实现 CORS 的服务器端,这通常是 Web 服务器配置工作(即在 httpd.conf 文件中),或者通过编写允许资源的自定义 OPTIONS 请求处理程序分享到发起 POST 请求的页面。

在最后两个选项中,您可能想考虑一下您的网页上线后“原点”会是什么样子。允许访问“*”可能会起作用,但会撤消浏览器正在帮助您的跨站点脚本保护。

【讨论】:

  • 我尝试将 Access-Control-Allow-Origin 设置为 * 但同样的错误不断出现。
  • 实际上,我对您的应用程序和 API 有点困惑。我在问题中看到 localhost、localhost:8081 和 localhost:8082?哪一个托管 POST API,哪一个托管她是 POST 请求的表单? POST API 还需要响应 OPTIONS,使用“允许”响应标头告诉您的浏览器让 POST 请求通过。参考 OPTIONS 请求,您的问题中的错误消息显示“它没有 HTTP ok 状态”。因此,如果您手动编写,请不要忘记将响应状态设置为 200。
  • 如果您正在运行某种代理来进行开发/调试,请尝试将其关闭并直接连接页面和 API。
  • API 在 localhost 上运行,应用程序在 localhost:8082 上运行,尽管每次我重新启动服务器时,localhost 都会转到不同的端口,因此解释了 localhost:8081。当时我写了这个问题,我还没有将我的代码更新到 localhost:8082。我也没有运行代理。
  • 好吧,CORS 的问题是每次调用 API 都是对 API 的 2 次调用。处理 POST 请求的 PHP 代码只有在浏览器第一次发出 OPTIONS 请求后才会被调用。因此,请创建一个 OPTIONS 请求处理程序,该处理程序返回“允许”标头,而不是在您的 POST 响应中。关于状态不是“ok”的错误可能是因为 OPTIONS 请求的状态是 404 未找到。 (或 405,如果那里有不处理 OPTIONS 的资源。)
猜你喜欢
  • 2022-01-14
  • 2020-06-02
  • 2019-11-30
  • 2019-10-01
  • 1970-01-01
  • 2021-05-19
  • 2020-07-03
  • 2020-08-15
  • 2021-02-28
相关资源
最近更新 更多