代码之家  ›  专栏  ›  技术社区  ›  Matthew M

由于有问题的405个错误而禁用CORS

  •  -1
  • Matthew M  · 技术社区  · 8 年前

    背景:

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

    我有一个使用Ionic框架(基于Angular)的移动应用程序,并有以下代码使用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
    

    还有更多使用composer的中间产品。

    我还运行了 Slim Website 没有成功。

    没有起作用,这给我带来了太多的麻烦,所以我只想让cors永久残疾,因为它弊大于利。

    我不知道问题的原因是什么,一个错误的httpclient请求或cors是一个正常的疼痛。

    如果有人能帮忙,请告诉我。

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

    一些错误:

    Safari引发:加载资源失败:飞行前响应不成功

    chrome throws:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源”头。起源 http://localhost:8100 因此不允许访问。响应的http状态代码为405。

    chrome也抛出:选项 http://localhost/api/v2/update/status/ {id}405(不允许使用方法)

    2 回复  |  直到 8 年前
        1
  •  1
  •   Daan    8 年前

    发送带有响应的头:

    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');
    

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

        2
  •  0
  •   Matthew M    8 年前

    codekit是cors不工作的问题。当直接通过mamp运行时,所有请求都正常返回,但是当通过codekit服务器发送相同的请求时,cors中间件不起作用。

    我相信大安的回答更适合其他有这个问题的人,所以会标记为正确的。