Angular $ http发送OPTIONS而不是PUT / POST

我正在尝试通过PHP后端更新/插入MySQL数据库中的数据。 我正在用AngularJS构build前端,并使用$http服务与REST API进行通信。

我的设置看起来像这样:

我通过$ httpProvider设置头文件:

  $httpProvider.defaults.withCredentials = true; $httpProvider.defaults.headers = {'Content-Type': 'application/json;charset=utf-8'}; 

POST-Call看起来像这样:

  return $http({ url: url, method: "POST", data: campaign }); 

Chrome中的开发控制台向我展示了这一点:

在这里输入图像说明

当我从POST更改为PUT时,我发送一个OPTIONS调用,而不是一个PUT。 内容types切换到content-type

我的请求有效载荷是作为对象发送的:

在这里输入图像说明

如何正确设置我的标题?


编辑:

PHP后端设置了一些头文件:

  $e->getResponse() ->getHeaders() ->addHeaderLine('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); $e->getResponse() ->getHeaders() ->addHeaderLine('Access-Control-Allow-Origin', '*'); 

有什么遗漏吗?

好的,我已经解决了。

这是什么问题?
DELETE,PUT和POST的CORS工作stream程如下:

在这里输入图像说明

它所做的是:

  1. 检查哪个请求将被做
  2. 如果是POST,PUT或DELETE
  3. 它首先发送一个OPTION请求,以检查发送请求的域是否与服务器的域相同。
  4. 如果不是 ,它希望Access-Header被允许发送这个请求

这里重要:一个OPTIONS请求不会发送凭据

所以我的后端服务器不允许PUT请求。

解:
把它放在.htaccess文件中

 RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ blank.php [QSA,L] Header set Access-Control-Allow-Origin "http://sub.domain:3000" Header always set Access-Control-Allow-Credentials "true" Header always set Access-Control-Max-Age "1000" Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" 

之后,在公用文件夹内创build一个名为blank.php的空的.php文件。

编辑:正如一位评论者指出,而不是创build一个空的PHP文件,你可以添加这个重写规则到你的.htaccess文件\;

 RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]] 

澄清:

  1. 我已经发送了Access-Control-Header
  2. 它解决的是前两行,而且
  3. Access-Control-Allow-Origin来自具有Port的特定子域

我可以find最好的网站来了解更多关于CORS的信息 。

你不需要手动指定你的$http头文件,这一切都是在幕后完成的,并且它们被自动设置为application/json用于POSTPUTtypes的请求。 所以你应该做的就是

 $http.post(url, data); $http.put(url, data);