我正在尝试通过 PHP 后端在 MySQL 数据库中更新/插入数据。我正在使用 AngularJS 构建前端,并使用 $http
服务与 REST API 进行通信。
我的设置如下所示:
我正在通过 $httpProvider 设置 header :
$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。并且内容类型只切换到 content-type
。
我的请求负载作为对象发送:
How do I set my header properly?
编辑:
PHP 后端设置了一些 header :
$e->getResponse()
->getHeaders()
->addHeaderLine('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
$e->getResponse()
->getHeaders()
->addHeaderLine('Access-Control-Allow-Origin', '*');
Is there something missing?
最佳答案
好的,我已经解决了。
出了什么问题?
DELETE、PUT 和 POST 的 CORS 工作流程如下:
它的作用是:
- 检查将发出哪个请求
- 如果是 POST、PUT 或 DELETE
- 它首先发送一个 OPTION 请求以检查发送请求的域是否与来自服务器的域相同。
- 如果没有,它希望允许一个 Access-Header 发送这个请求
Important here: An OPTIONS request doesn't send credentials.
所以我的后端服务器不允许 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"
之后,在公共(public)文件夹中创建一个名为 blank.php 的空 .php 文件。
编辑:正如一位评论者指出的那样,您可以将此重写规则添加到您的 .htaccess 文件中,而不是创建一个空的 PHP 文件\;
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]
澄清一下:
- 我已经发送了 Access-Control-Header
- 它解决的是前两行,并且
- 来自具有端口的特定子域的 Access-Control-Allow-Origin
我能找到的最佳网站 learn more about CORS .
关于javascript - Angular $http 正在发送 OPTIONS 而不是 PUT/POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30254277/