我在服务器上设置了跨源资源共享(Jetty使用CrossOriginFilter),它在IE8和Firefox上运行良好。在Chrome上,它只是......没有。
$.ajax({ url : crossOriginURL,
type : "GET",
error : function(req, message) {
alert(message);
},
dataType : "json" } );
调用错误函数,并显示有用的消息“error”。它似乎正在提出请求,但没有任何你期望的标题。如果URL来自同一个来源,它可以正常工作。
答案 0 :(得分:24)
我用这种方式解决了我的问题:
将此添加到您的PHP代码:
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true ");
header("Access-Control-Allow-Methods: OPTIONS, GET, POST");
header("Access-Control-Allow-Headers: Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control");
或者将这些标题添加到您的回复中。
问题:浏览器在主要请求之前向服务器询问选项,检查网站是否允许允许与不同来源通信,然后如果是,则执行POST或GET请求。
编辑:试试这个(没有你的黑客)看你是否收到数据......
$.ajax({ url : crossOriginURL,
type : "GET",
error : function(req, message) {
alert(message);
},
success : function(data) {
alert(data);
},
dataType : "text"} );
答案 1 :(得分:13)
看起来原始海报可能已经解决了他们的问题,但对于与评论家Elisabeth有相同问题的任何人,我认为问题可能是Chrome拒绝为CORS请求设置Origin标头如果您正在运行来自本地文件的请求。它甚至不会让您显式覆盖Origin标头。这会导致服务器看到“Origin:null”,在大多数情况下会导致403。 Firefox显然没有这样的限制,因为我发现了很多头发。
如果您在这种情况下绝对需要使用Chrome,则可以通过在本地运行网络服务器并始终通过http:而不是通过文件来访问您的文件来解决您的问题:。
答案 2 :(得分:12)
最终对我有用的是xhr.setRequestHeader('Content-Type', 'text/plain');
答案 3 :(得分:0)
在我的例子中,它是localhost:8001(前端),它试图在localhost:7001(在server.js上作为节点服务器)调用API。即使我在Chrome上安装并打开了CORS插件,但仍然是CORS政策拒绝了它们作为预检案例。
我花了半天多才终于解决了这个问题。 不管你信不信,这是“愚蠢”的步骤:
我。关闭CORS插件,重新加载应用程序,此时你仍然应该得到正确的错误。
II。将其重新打开,重新加载应用程序,如果API成功,请停在此处,无需继续执行iii。
III。但是,如果您仍然获得CORS拒绝,请卸载Chrome并安装最新的Chrome。
IV。在新的Chrome上,以前安装的CORS插件应该仍然存在,但处于OFF状态。
诉重新加载页面,您应该在控制台上获得正确的CORS拒绝消息。
VI。将其重新打开,重新加载页面,错误应该消失。
如果上述步骤在您的情况下仍不起作用,则无其他想法。
我还在server.js(Node)上尝试了以下操作但仍然无法正常工作,所以不用费心去尝试:
var app = express();
var cors = require('cors'); // Already done “npm i cors --save-dev”
app.options('*', cors());
答案 4 :(得分:0)
当我更新Chrome时,遇到了问题,我已经解决了Google扩展“ Access-Control-Allow-Credentials”的新版本。如果是旧版本,则无需使用新的Google Chrome版本
答案 5 :(得分:0)
检查以确保您未将服务器设置为既允许凭据,又未将allow origin标头设置为*。如下所示:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
如果服务器正在为这些标头返回这些值,则它将无法工作。如果将Access-Control-Allow-Credentials
设置为true
,则不能使用*
作为Access-Control-Allow-Origin
标头的值。以下是MDN网络文档摘录的标头(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin):
For requests without credentials, the literal value "*" can be specified, as a wildcard;
the value tells browsers to allow requesting code from any origin to access the resource.
Attempting to use the wildcard with credentials will result in an error.
如果是上述情况,只需将Access-Control-Allow-Credentials
设置为false
。
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: false
答案 6 :(得分:0)
我们实际上有两个域,一个用于控制面板 dashboard.app.com
,另一个用于公共网站 app.com
。请求来自公共网站,PHP 路由重定向到仪表板域,这就是我们收到错误的原因。解决方案是将所有请求保留在同一个域中,无需重定向。
答案 7 :(得分:-5)
CORS适用于Chrome。只需使用chrome是安全模式,即使用禁用安全设置。 谷歌它,或者你甚至可以从命令行开始。