好的,我已经解决了。
问题出在哪里?
DELETE、PUT 和 POST 的 CORS 工作流程如下:
它的作用是:
- 检查将要发出哪个请求
- 如果是 POST、PUT 或 DELETE
- 它首先发送一个 OPTION 请求,以检查发送请求的域是否与服务器的域相同。
-
If not,它希望允许访问标头发送此请求
这里重要的是:OPTIONS 请求不发送凭据.
所以我的后端服务器不允许 PUT 请求。
解决方案:
将其放入.htaccess
file
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-Allow-Origin
我能找到的最好的网站了解有关 CORS 的更多信息 http://www.html5rocks.com/en/tutorials/cors/?redirect_from_locale=de.