有一段时间,我一直面临着关于CORS的问题。我正在运行带有localhost
的ExtJS应用程序,并且在REST进程中的删除过程中,它一直出现此错误:
Response for preflight has invalid HTTP status code 403.
我已经达到了这些主题;
我做了几件事,但没有一件对我有用!
使用CORS的扩展名:Allow-Control-Allow-Origin:*,这是扩展程序设置的屏幕截图:
我在MacOS上使用Chrome Canary并使用web-security-disabled
运行它。浏览器正在使用FLAG打开,并注意到这是web-security-disabled mod但不知何故它的行为不符合预期。这是我用来运行它的终端命令:
open -a /Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --args --disable-web-security --/ChromeDisabled
但是效果不好!那么我做错了什么?我该如何解决这个问题?
答案 0 :(得分:2)
我想你想解决这个问题,为什么它会给出错误403.问题在于服务器端,而不是浏览器和ExtJS。
错误403表示"未经授权"。那么,你为什么未经授权?什么是"预检"?
预检请求是浏览器使用OPTIONS
HTTP方法发送到后端的特殊请求。它在实际请求之前发送,并且在没有标头,cookie或其他身份验证数据的情况下发送。它不应该返回数据,只有少数标头指示允许哪些域CORS请求访问URL,以及它们可以发送哪些方法和标头。如果浏览器发现响应信息允许它发送实际请求,它将发送实际请求并处理返回的数据。
因此,为了支持CORS,针对后端的OPTIONS请求必须始终通过未经身份验证,因为不能发送任何身份验证信息。 但是,您的后端不允许OPTIONS请求通过未经身份验证。
您可能想要检查您使用的身份验证代码,并尝试获取有关身份验证的OPTIONS请求(当然,他们不应该返回任何数据)。我对你的后端技术一无所知,你可能想问一下如何用正确的标签在另一个问题中解决这个问题;在C#中它会是这样的(我猜你在某种程度上有类似的功能):
[HttpOptions]
[AllowAnonymous]
public HttpResponseMessage GenerateDemoKey() {
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
response.Headers.Add("Access-Control-Allow-Headers", "Origin, Content-Type, X-Auth-Token, X-Requested-With, Authorization");
return response;
}
因此,如果它是OPTIONS
请求(第1行),则网址为.../GenerateDemoKey
(第3行),它可能会经过未经授权的(第2行),并且响应状态为200:OK(第4行)添加了标题,告诉浏览器允许来自任何域的站点访问真实URL(第5行),只要它们使用六种命名方法之一(第6行)并仅发送五个命名标题(第7行)。
另一方面,在PHP中,您需要在处理身份验证之前在脚本的开头添加一个if块 :
<?php
if($_SERVER['REQUEST_METHOD']=="OPTIONS") {
header("Access-Control-Allow-Origin: *")
header("Access-Control-Allow-Methods: GET, POST*")
header("Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token, X-Requested-With, Authorization")
exit(0);
}
如果使用htaccess进行身份验证,则可能必须向htaccess文件添加规则以允许OPTIONS请求通过。有了htaccess和PHP的组合,那里存在巨大的安全风险 - 请确保仅将那些已检查过的URL列入白名单,并在使用OPTIONS方法调用时返回私人信息。