【问题标题】:No 'Access-Control-Allow-Origin' header is present不存在“Access-Control-Allow-Origin”标头
【发布时间】:2015-05-09 16:49:22
【问题描述】:

我正在使用 angular.js 为使用 cordova 的移动设备制作一个 ReSTful 应用程序。 对于服务器端,我使用的是 slim framework.all 根据本教程:(http://www.angularcode.com/user-authentication-using-angularjs-php-mysql/)

但是当我将 api 文件夹上传到服务器时,出现错误: 请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'localhost' 不允许访问。响应的 HTTP 状态代码为 404。

我已阅读有关添加“Access-Control-Allow-Origin”的信息 并根据此链接实施: http://help.slimframework.com/discussions/problems/810-no-subject

$app->get('/session', function() {
    **$response->header('Access-Control-Allow-Origin', '*');**  
    $db = new DbHandler();
    $session = $db->getSession();
    $response["uid"] = $session['uid'];
    $response["email"] = $session['email'];
    $response["name"] = $session['name'];
    echoResponse(200, $session);
});

也试过了

$app->get('/session', function() {
    **$session->header('Access-Control-Allow-Origin', '*');**  
    $db = new DbHandler();
    $session = $db->getSession();
    $response["uid"] = $session['uid'];
    $response["email"] = $session['email'];
    $response["name"] = $session['name'];
    echoResponse(200, $session);
});

我仍然收到同样的错误。

--> 最后一行是否正确? echoResponse(200, $session);

提前谢谢你:)

更新

我在 Firefox 和 chrome 上使用相同的文件,并且 chrome 能够访问服务器上的文件。 我的服务器上的一个 JSON 文件之前也被 cordova 应用程序访问过,现在无法正常工作。调用代码完全相同,即

.controller('ListController', ['$scope', '$http', function($scope, $http) {
  $http.get('js/data.json').success(function(product_data) {
    $scope.artists = product_data;
  });
}])

【问题讨论】:

  • 做更多的阅读......它不仅仅是一个标题,还需要考虑预检请求
  • 好的开始是将标头写入实际响应。您现在正尝试将其写入未定义的变量。使用 $app->response->header(...) 代替。
  • @MikaTuupola 你的意思是只为那条线或任何地方改变(到 $app->response)?

标签: javascript php angularjs cordova slim


【解决方案1】:

使用 --disable-web-security 标志打开 Chrome。这将阻止它出现并允许您在桌面上进行开发。

Cordova / PhoneGap 在应用程序形式时基本上会为您执行此操作。您可能需要环顾四周,了解如何使用标志打开它,具体取决于您使用的操作系统。

另外,请勿在启用标志的情况下继续使用浏览器进行正常活动。如果可能,还可以使用 CLI 打开一个新的用户配置文件,这样它就不会影响您现有的配置文件并让您面临任何安全漏洞。

【讨论】:

  • 您为什么建议这样做而不是实施 CORS?这是服务器端的问题,所以手机也会有同样的问题。
  • 这是我在本地服务器上尝试我的应用程序时所做的,但问题出在服务器上,因为未授予权限。
  • @Cerad 这就是我在最近开发的一个 Cordova 应用程序上解决问题的方法,不同之处在于我使用的是第三方 API。但是,嘿,如果它有效,那不是问题。似乎在这种情况下,不幸的是它不起作用。
【解决方案2】:

某些 Web 浏览器不允许来自 localhost(或 localhost 的任何别名,例如 127.0.0.1)的 CORS。解决方案是使用非本地 url 访问它。

您的 IP 地址是一个可能有效的 URL。

如果您不想使用您的 IP 地址(可能是因为每次连接时路由器都会随机分配它),那么您可以通过修改 /etc/hosts(或 Windows 上的 Windows\System32\Drivers\etc\hosts)为自己分配一个假域名。

例如,将此添加到/etc/hosts

127.0.1.1   thismachine

然后您可以通过在您的网络浏览器中输入http://thismachine 来访问您的网络服务器。

【讨论】:

  • 以上两个代码哪个是正确的,哪个变量应该放在最后一行
  • 只有一个代码。第二个是您在浏览器中输入的内容
  • 另外,您定义域的哪一行并不重要。我更喜欢把它放在文件的顶部。有些人更喜欢把它放在最后一行。只要确保文件以换行符结尾,以防某些软件在没有换行符的情况下拒绝处理最后一行 - 这就是我更喜欢将它放在顶部的原因。
猜你喜欢
  • 2018-10-28
  • 2019-08-15
  • 2017-02-21
  • 2015-09-28
  • 2016-10-30
  • 1970-01-01
  • 2016-01-11
  • 2016-05-07
  • 2018-07-27
相关资源
最近更新 更多