仅FireFox中AngularJS post的CORS错误

仅FireFox中AngularJS post的CORS错误,angularjs,firefox,laravel,ionic-framework,cors,Angularjs,Firefox,Laravel,Ionic Framework,Cors,我只有在Ionic应用程序中发出跨源请求时才遇到FireFox问题(因此它使用AngularJS)。js应用程序正在对Laravel 5.1 API执行$http.post(),我只在FireFox(39.0.3)中收到以下错误: 已阻止跨源请求:同一源策略不允许读取位于的远程资源。(原因:CORS飞行前频道的CORS标头“访问控制允许标头”中缺少令牌“内容类型”) 这是在我的本地主机(OSX Mavericks)上。并且在Chrome和Safari中运行良好,只有FireFox出现错误。我已经

我只有在Ionic应用程序中发出跨源请求时才遇到FireFox问题(因此它使用AngularJS)。js应用程序正在对Laravel 5.1 API执行$http.post(),我只在FireFox(39.0.3)中收到以下错误:

已阻止跨源请求:同一源策略不允许读取位于的远程资源。(原因:CORS飞行前频道的CORS标头“访问控制允许标头”中缺少令牌“内容类型”)

这是在我的本地主机(OSX Mavericks)上。并且在Chrome和Safari中运行良好,只有FireFox出现错误。我已经清除了缓存,并在“私人窗口”中进行了尝试,得到了相同的结果

以下是为处理选项请求而定义的Laravel路线:

Route::options('endpoint', function() {
    return response('OK')
        ->header('Access-Control-Allow-Headers ', 'Origin, Authorization, X-Requested-With, Content-Type, Accept')
        ->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
        ->header('Access-Control-Allow-Origin', '*')
        ->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0')
        ;
});

Route::post('endpoint', array('uses' => '\Path\To\Controller@endpoint'));

我确实发现只有在FireFox中才有类似的问题,但解决方案是用逗号分隔
允许方法,我已经做到了。

在后端尝试放置

->header('Access-Control-Allow-Credentials', 'true')
在前端试着放

.config(function($locationProvider, $httpProvider) {
    // CORS requests with credentials
    $httpProvider.defaults.withCredentials = true;
})
消息“缺少令牌‘内容类型’”是关于客户端的。要使http请求成为有效的post请求,它必须具有标头

'Content-Type': 'application/x-www-form-urlencoded' 

第一种内容类型是最常见的

在angularjs中,执行CORS post请求的一种方法是

$http.post(
        'http://external-domain.ext/the/rest/url',
        'param_name=param_value',
        {headers:{'Content-Type': 'application/x-www-form-urlencoded'}}
    ).
    then(function successCallback(response) {
       $scope.something = response;
    }, function errorCallback(response) {
       // not good
    });
如果服务器配置为
标题('Access-Control-Allow-Origin','*')
,CORS post必须在没有身份验证和凭据的情况下成功。

您是否有$httpProvider.defaults.withCredentials=true;在AngularJS.config()中设置?我没有。我将它添加到$http.post()中的
config
对象中,现在它抱怨
Access Control Allow Origin
“*”不匹配。一些快速研究表明,当使用带有凭据的
时,我不应该使用
“*”
,而是甚至将
访问控制允许源代码更改为
http://localhost:8100/#/clientpage
(以及我能想到的所有变化),它仍然返回一个与
Access Control Allow Origin
标题不匹配的错误。这个概念对我来说是新的,你能推荐一个很好的例子吗。还有,为什么它以前在其他浏览器中工作过,只是在FireFox中不工作?“*”通配符可能不起作用是的CORS有点棘手,阅读一下,你应该能够找到它。你找到解决方案了吗?我完全被这个问题困住了。
$http.post(
        'http://external-domain.ext/the/rest/url',
        'param_name=param_value',
        {headers:{'Content-Type': 'application/x-www-form-urlencoded'}}
    ).
    then(function successCallback(response) {
       $scope.something = response;
    }, function errorCallback(response) {
       // not good
    });