【问题标题】:Redirect http calls to https in a Backbone app running on Express in Node.js在 Node.js 中的 Express 上运行的 Backbone 应用程序中将 http 调用重定向到 https
【发布时间】:2014-09-23 16:32:36
【问题描述】:

我有一个在 Node.js 中的 Express 服务器上运行的主干应用程序。

我使用 http 构建了我的应用程序,现在我想切换到 https。

由于是单页应用,主要驻留在客户端,创建两台服务器监听http和https,然后将所有http调用重定向到https是不够的:

var express = require('express'),
    http = require('http'),
    https = require('https');

var app = express();

// keys for https server
var hskey = fs.readFileSync('./keys/my-key.pem');
var hscert = fs.readFileSync('./keys/my-cert.pem')

var options = {
    key: hskey,
    cert: hscert
};

// Middleware to redirect http calls to https
app.use(function(req, res, next) {

  if(!req.secure) {
    return res.redirect(['https://', req.get('Host'), req.url].join(''));
  } 
  next();

});

// http server listening on port 80
http.createServer(app).listen(80);

// https server listening on port 443
httpscreateServer(options, app).listen(443);

使用主干,对服务器的调用是通过 AJAX 完成的,引用主干js.org:

“Backbone.sync 是 Backbone 每次尝试读取或保存模型到服务器时调用的函数。默认情况下,它使用 jQuery.ajax 发出 RESTful JSON 请求并返回 jqXHR。”

并且您不能在 AJAX 之后进行重定向。你需要用Javascript自己做。 (res.redirect from POST)。

所以我上面写的服务器中的middleare重定向对于这种情况没有用。

然后,我想我可以将 AJAX 调用中的 url 更改为“https://”,而不是使用相对 url:

$.ajax ({
      url:'https://www.mydomain.com/api/getMyBooks',
      type:'GET',
      dataType:"jsonp"
});

为了避免跨域错误,我不得不将 dataType 更改为 jsonp。

好的,这似乎可行,但是如何更改浏览器中的 url 以显示安全连接 (https)?

我还更改了 Backbone 模型中定义的 url:

Entities.BookCollection = Backbone.Collection.extend({
    url: "https://localhost:4567/books",
    model: Entities.Book
});

但是在这里更改 Backbone 模型和集合中的 url 是我得到的:

跨域请求被阻止:同源策略不允许读取位于https://www.mydomain.com/api/getMyBooks 的远程资源。这可以通过将资源移动到同一域或启用 CORS 来解决。

但我在同一个域中,因为我在本地主机上工作。

我没有找到从 http 切换到 https 的好解决方案。我被困住了,任何帮助将不胜感激。

【问题讨论】:

    标签: backbone.js express https


    【解决方案1】:

    最后,我想我找到了解决方案。您不必更改模型和集合中的 AJAX 调用或 url。

    您需要在启动 Backbone 应用程序时进行重定向:

    BookManager.on("initialize:after", function(){
    
      if(Backbone.history){
    
        require(["apps/book/book_app"], function () {
    
          Backbone.history.start();
    
            if (window.location.protocol === 'http:') {
              window.location = "https://localhost:4567/#"+ BookManager.getCurrentRoute();
            }
    
        });
      }
    });
    

    我检查输入的 url 是 http 还是 https,如果是 https,则使用 window.location 进行重定向。

    你仍然需要创建两个服务器来监听 http 和 https 连接。

    这对我有用。不确定是否有更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 2023-03-28
      • 2017-08-28
      • 2014-07-17
      • 2014-02-05
      • 2017-05-16
      • 2011-06-24
      相关资源
      最近更新 更多