44

我正在使用 AngularJS,$resource$http使用apis,但是由于安全原因,我需要发出 HTTPS 请求(在 HTTPS 协议下工作)。

https在 AngularJS中使用的方法是什么。

谢谢你的帮助。

4

3 回答 3

28

出于某种原因,如果您的请求末尾没有尾部 / ,Angular 将通过 HTTP 发送所有请求。即使页面本身是通过 HTTPS 提供的。

例如:

$http.get('/someUrl').success(successCallback);  // Request would go over HTTP even if the page is served via HTTPS

但是,如果您添加前导 / 一切都会按预期工作:

$http.get('/someUrl/').success(successCallback);  // This would be sent over HTTPS if the page is served via HTTPS

编辑:这个问题的根本原因是 Angular 查看来自服务器的实际标头。如果您通过 https 的 http 数据内部传递不正确,那么仍然会有 http 标头,如果您没有在末尾添加 /,Angular 会使用它们。即,如果您有一个通过 https 提供内容的 NGINX,但通过 http 在后端将请求传递给 Gunicorn,您可能会遇到此问题。解决这个问题的方法是将正确的标头传递给 Gunicorn,这样您的框架就会被认为是通过 https 提供服务的。在 NGINX 中,您可以使用以下行来执行此操作:

proxy_set_header X-Forwarded-Proto $scheme;

于 2016-01-12T20:03:07.300 回答
27

像往常一样使用$httpapi:

$http.get('/someUrl').success(successCallback);

如果您的应用程序通过 HTTPS 提供服务,那么您进行的任何调用都是针对同一主机/端口等的,因此也可以通过 HTTPS 进行。

如果您对请求使用完整的 URI,例如$http.get('http://foobar.com/somePath'),那么您将不得不更改您的 URI 以使用https

于 2013-09-17T00:49:43.083 回答
9

我最近在使用 Angular 1.2.26 时遇到了类似的问题,但仅在通过负载平衡器进行交互时——这可能会剥离与 https 相关的标头……尚不确定原因。我已经诉诸于此:

uri = $location.protocol() + "://" + $location.host() + "/someUrl"

如果使用非标准端口,您可能还需要添加 $location.port()。

于 2014-12-15T17:46:06.600 回答