【发布时间】: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