由于405错误导致错误,因此禁用CORS

时间:2018-06-07 09:53:34

标签: php angular ionic-framework cors slim

背景:

我创建了一个基于slim的API,目前正在本地域运行,例如localhost / api

我有一个使用离子框架的移动应用程序(基于角度)并使用httpClient作为http具有以下代码:

let accessurl = this.general.apiURL + '/v2/update/status/' + this.machineToChange;
    const headers = new HttpHeaders()
      .set('Authorization', 'Bearer: ' + this.general.apiKey);
    this.http.put(accessurl, {
      statusFuelled: 1
    }, { headers: headers }).subscribe(result => {
      console.log(JSON.stringify(result));
    }, err => {
      console.log(JSON.stringify(err));
    });

我已经尝试了每一个堆栈溢出问题,我可以找到让slim框架禁用cors,这里只是几个:

$app->options('/update/status/{machineNo}', function ($request, $response) {
  header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
  header('Access-Control-Allow-Credentials: true');
  header('Access-Control-Max-Age: 86400');    // cache for 1 day
  return $response->withStatus(200);
});

或者:

//http://stackoverflow.com/questions/18382740/cors-not-working-php
  if (isset($_SERVER['HTTP_ORIGIN'])) {
      header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
      header('Access-Control-Allow-Credentials: true');
      header('Access-Control-Max-Age: 86400');    // cache for 1 day
  }

  // Access-Control headers are received during OPTIONS requests
  if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

      if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
          header("Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS");

      if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
          header("Access-Control-Allow-Headers:        {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

      exit(0);
  }

或者:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
header('Content-Type: application/json');

或者.HTACCESS:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Header add Access-Control-Allow-Headers: Content-Type

还有更多使用作曲家的中间件。

我还从Slim Website运行了代码但没有成功。

没有工作,这给我带来了很多麻烦,所以我只是想永久地禁用CORS,因为它弊大于利。

我不知道问题出在哪里,错误的httpClient请求或CORS是正常的痛苦。

如果有人可以提供帮助,请告诉我。

由于服务器的限制,我运行的是PHP 5.6,因此像tuupola / cors这样的中间件由于PHP <7而无法工作

一些错误:

Safari投掷:无法加载资源:预检响应不成功

Chrome浏览器:对预检请求的响应未通过访问控制检查:否&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。起源&#39; http://localhost:8100&#39;因此不允许访问。响应的HTTP状态代码为405。

Chrome也会抛出:选项http://localhost/api/v2/update/status/ {ID} 405(方法不允许)

2 个答案:

答案 0 :(得分:1)

发送带有回复的标题:

return $response
        ->withHeader('Access-Control-Allow-Origin', '*')
        ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization')
        ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');

另请参阅精简文档:https://www.slimframework.com/docs/v3/cookbook/enable-cors.html

答案 1 :(得分:0)

CodeKit是CORS无法正常工作的问题。当直接通过MAMP运行时,所有请求都正确返回,但是当通过CodeKit服务器发送相同请求时,CORS中间件无法正常工作。

我相信Daan的回答更适合有这个问题的其他人,所以会认为那个是正确的。