如何在AngularJS中使用HTTPS?

Dic*_*mpo 43 javascript node.js angularjs angular-ui

我使用AngularJS,$resource$http与工作apis,但由于安全原因,我需要做(HTTPS协议下工作)的HTTPS请求.

https在AngularJS中使用的方法是什么.谢谢你的帮助.

cra*_*igb 27

$http像往常一样使用api:

$http.get('/someUrl').success(successCallback);
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序是通过HTTPS提供的,那么您正在进行的任何调用都是通过HTTPS进行相同的主机/端口等.

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

  • 由于我的`$ http`确实使用`http://`协议而不是`https://`进行请求,尽管页面是从https提供的. (11认同)
  • 它只是使用http调用,我不得不将`'/ someUrl'改为`$ window.location.origin +'/ someUrl'`. (5认同)

Dan*_*nil 26

出于某种原因,如果您在请求结束时没有拖尾,Angular将通过HTTP发送所有请求.即使页面本身是通过HTTPS提供的.

例如:

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

但是如果你添加一个领先/一切都会按预期工作:

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

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

proxy_set_header X-Forwarded-Proto $ scheme;

  • 非常感谢@Danil,这是一个混乱,api调用不起作用!但你的回答让我走上了正确的道路,我只用了5分钟就解决了这个问题. (2认同)

Cor*_*ork 9

我最近遇到类似的问题使用Angular 1.2.26,但只有在通过负载均衡器进行交互时 - 可能会剥离https相关的头文件......不确定原因.我求助于此:

uri = $location.protocol() + "://" + $location.host() + "/someUrl"
Run Code Online (Sandbox Code Playgroud)

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