Php 由于问题405错误而禁用CORS

Php 由于问题405错误而禁用CORS,php,angular,ionic-framework,cors,slim,Php,Angular,Ionic Framework,Cors,Slim,背景: 我创建了一个基于slim的API,目前正在本地域上运行,例如localhost/API 我有一个使用ionic框架(基于angular)的移动应用程序,并且有以下代码使用httpClient作为http: let accessurl = this.general.apiURL + '/v2/update/status/' + this.machineToChange; const headers = new HttpHeaders() .set('Authorizat

背景:

我创建了一个基于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);
});
或:

或:

或在.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的中间件

我还运行了来自的代码,但没有成功

非手术已经奏效了,这给我带来了很多麻烦,所以我只希望CORS永久失效,因为它弊大于利

我不知道问题是由什么原因引起的,一个错误的httpClient请求或者CORS像正常情况一样令人痛苦

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


由于服务器限制,我正在运行PHP5.6,因此tuupola/cors等中间件将无法工作,因为它是PHP发送带有响应的标题:

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文档:

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


我相信Daan的回答更适合其他有此问题的人,因此会将其标记为正确。

Htaccess显然缺少
header('Content-Type:application/json')
Access Control Allow Headers:Content Type
Hi Swoox,在完成成功或失败的请求时,使用
$response->with status(200)->with header(“Content Type”,“application/json”)发送内容类型头
所以我假设你在htaccess中不需要它:
Access Control Allow Headers:Content Type
不要像我的系统经理那样固执,我告诉他5次,fainnly做了并得到了修复。我将它添加到了Swoox中,但仍然没有运气,chrome正在抱怨“Access Control Allow Origin”标题,所以我猜这就是问题所在。检查Daan的答案。嗨,Daan,我在响应中添加了以下代码,但仍然收到相同的错误,我也浏览了文档并添加了它所述的内容,但仍然没有成功。似乎根本没有解决办法…@MatthewM你的堆栈看起来怎么样?是apache+modphp还是nginx+php fpm,等等。。。它在负载平衡器后面吗?不要禁用CORS,只需了解如何正确配置Web服务器即可。你不会因为你的钥匙坏了就把锁扔出门外。我相信这是Apache+modphp,没有负载平衡器,我正在使用MAMP托管本地版本的API,这也是应用程序所指向的,使用默认配置。然后使用curl向API端点发出
选项
请求,并向我们显示响应头。很抱歉@emix出现延迟,我对curl不太熟悉,因为我通常使用postman,所以正常put请求的响应是。但是,选项请求仅包含以下标题:接受范围、连接、内容长度和日期。
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
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');