如何配置 express js 4 为 http 中的某些页面和 https 中的其他页面提供服务?
How to configure express js 4 to serve some pages in http and others in https?
是否有任何方法可以使用 express js 4 配置节点 js 应用程序以在 http 协议和其他需要更高安全性的 https 协议下提供某些页面?
我描述了我的问题:我正在开发一个在线商店,我想显示某些页面,例如 http
下的产品列表或产品详细信息视图,以及其他我认为需要更高安全性的页面,例如登录或购物车视图,根据 https
协议。
我试过 express-force-ssl
模块,但它不起作用。以下代码片段不是来自我的应用程序(太脏了),它只是一个示例,alos 对我不起作用:
var express = require('express');
var forceSSL = require('express-force-ssl');
var fs = require('fs');
var http = require('http');
var https = require('https');
var ssl_options = {
key: fs.readFileSync('./server-private-key.pem'),
cert: fs.readFileSync('./server-certificate.pem'),
ca: fs.readFileSync('./server-certificate-signing-request.pem')
};
var app = express();
var server = http.createServer(app);
var secureServer = https.createServer(ssl_options, app);
app.use(forceSSL);
app.get('/', function (req, res, next) {
res.send('<a href="/user/userA">Hello</a>')
});
app.get('/user/:name', function (req, res, next) {
var user = req.params.name;
res.send('<a href="/login">Hello ' + user + '</a>')
});
app.get('/login', forceSSL, function (req, res, next) {
res.send('<a href="/">Hello</a><br/><a href="/logout">Goodbye</a>')
});
app.get('/logout', forceSSL, function (req, res, next) {
res.send('<a href="/">Hello</a>')
});
secureServer.listen(443)
server.listen(8085)
console.log('server started');
结果是,当我使用 url http://localhost:8085
启动应用程序时,服务器会自动将其重定向到 https://localhost
并以 https
协议提供所有页面。
我想要的是从 http://localhost:8085
开始,导航到 http://localhost/user/userA
,然后从它转到 https://localhost/login
,如果单击 "Hello" link, 我想被重定向到 http://localhost:8085
.
在没有 express-force-ssl
模块的情况下,是否缺少任何代码来获得我想要的行为,或者是否有任何其他方法可以实现它?
我已询问 express-force-ssl
模块的作者,他告诉我重定向行为按预期工作。 Here is the post.
但在其代码中深入研究了一点,我创建了一个自定义插件来解决我的问题。这是代码:
var parseUrl = require('url').parse;
var isSecure = function (req) {
if (req.secure) {
return true;
}
else if (
req.get('X-Forwarded-Proto') &&
req.get('X-Forwarded-Proto').toLowerCase &&
req.get('X-Forwarded-Proto').toLowerCase() === 'https') {
return true;
}
return false;
};
exports = module.exports = function (req, res, next) {
if (isSecure(req)) {
if (req.method === "GET") {
var httpPort = req.app.get('httpPort') || 80;
var fullUrl = parseUrl(req.protocol + '://' + req.header('Host') + req.originalUrl);
res.redirect('http://' + fullUrl.hostname + ':' + httpPort + req.originalUrl);
}
else {
next();
}
}
else {
next();
}
};
它与 force-ssl
文件非常相似,但在这里我们管理相反的操作,即,当路由被强制到它时,我在这里重定向到 http
。所以需要在http
protocol:
下为我们希望看到的每条路由添加该功能
var express = require('express');
var forceSSL = require('express-force-ssl');
var fs = require('fs');
var http = require('http');
var https = require('https');
var useHttp = require('./useHttp');
var ssl_options = {
key: fs.readFileSync('./server-private-key.pem'),
cert: fs.readFileSync('./server-certificate.pem')
};
var app = express();
var server = http.createServer(app);
var secureServer = https.createServer(ssl_options, app);
app.get('/', useHttp, function (req, res, next) {
res.send('<a href="/user/userA">Hello</a>')
});
app.get('/user/:name', useHttp, function (req, res, next) {
var user = req.params.name;
res.send('<a href="/login">Hello ' + user + '</a>')
});
app.get('/login', forceSSL, function (req, res, next) {
res.send('<a href="/">Hello</a><br/><a href="/logout">Goodbye</a>')
});
app.get('/logout', forceSSL, function (req, res, next) {
res.send('<a href="/">Hello</a>')
});
app.set('httpsPort', 9090);
app.set('httpPort', 8085);
secureServer.listen(9090)
server.listen(8085)
console.log('server started');
如您所见,我现在需要在所有路由中指定使用哪个协议:useHttp
用于 http
或 forceSSL
用于 https
。
虽然我对这个解决方案一点也不满意,因为我必须在所有路由中指定我想要的协议类型。但至少它有效。因此,如果有人找到任何其他解决方案,我将非常高兴,例如,在中间件层中添加一个函数来管理所有 http
请求,并在使用 forceSSL
指定时重定向到 https
.到目前为止,这有效。
是否有任何方法可以使用 express js 4 配置节点 js 应用程序以在 http 协议和其他需要更高安全性的 https 协议下提供某些页面?
我描述了我的问题:我正在开发一个在线商店,我想显示某些页面,例如 http
下的产品列表或产品详细信息视图,以及其他我认为需要更高安全性的页面,例如登录或购物车视图,根据 https
协议。
我试过 express-force-ssl
模块,但它不起作用。以下代码片段不是来自我的应用程序(太脏了),它只是一个示例,alos 对我不起作用:
var express = require('express');
var forceSSL = require('express-force-ssl');
var fs = require('fs');
var http = require('http');
var https = require('https');
var ssl_options = {
key: fs.readFileSync('./server-private-key.pem'),
cert: fs.readFileSync('./server-certificate.pem'),
ca: fs.readFileSync('./server-certificate-signing-request.pem')
};
var app = express();
var server = http.createServer(app);
var secureServer = https.createServer(ssl_options, app);
app.use(forceSSL);
app.get('/', function (req, res, next) {
res.send('<a href="/user/userA">Hello</a>')
});
app.get('/user/:name', function (req, res, next) {
var user = req.params.name;
res.send('<a href="/login">Hello ' + user + '</a>')
});
app.get('/login', forceSSL, function (req, res, next) {
res.send('<a href="/">Hello</a><br/><a href="/logout">Goodbye</a>')
});
app.get('/logout', forceSSL, function (req, res, next) {
res.send('<a href="/">Hello</a>')
});
secureServer.listen(443)
server.listen(8085)
console.log('server started');
结果是,当我使用 url http://localhost:8085
启动应用程序时,服务器会自动将其重定向到 https://localhost
并以 https
协议提供所有页面。
我想要的是从 http://localhost:8085
开始,导航到 http://localhost/user/userA
,然后从它转到 https://localhost/login
,如果单击 "Hello" link, 我想被重定向到 http://localhost:8085
.
在没有 express-force-ssl
模块的情况下,是否缺少任何代码来获得我想要的行为,或者是否有任何其他方法可以实现它?
我已询问 express-force-ssl
模块的作者,他告诉我重定向行为按预期工作。 Here is the post.
但在其代码中深入研究了一点,我创建了一个自定义插件来解决我的问题。这是代码:
var parseUrl = require('url').parse;
var isSecure = function (req) {
if (req.secure) {
return true;
}
else if (
req.get('X-Forwarded-Proto') &&
req.get('X-Forwarded-Proto').toLowerCase &&
req.get('X-Forwarded-Proto').toLowerCase() === 'https') {
return true;
}
return false;
};
exports = module.exports = function (req, res, next) {
if (isSecure(req)) {
if (req.method === "GET") {
var httpPort = req.app.get('httpPort') || 80;
var fullUrl = parseUrl(req.protocol + '://' + req.header('Host') + req.originalUrl);
res.redirect('http://' + fullUrl.hostname + ':' + httpPort + req.originalUrl);
}
else {
next();
}
}
else {
next();
}
};
它与 force-ssl
文件非常相似,但在这里我们管理相反的操作,即,当路由被强制到它时,我在这里重定向到 http
。所以需要在http
protocol:
var express = require('express');
var forceSSL = require('express-force-ssl');
var fs = require('fs');
var http = require('http');
var https = require('https');
var useHttp = require('./useHttp');
var ssl_options = {
key: fs.readFileSync('./server-private-key.pem'),
cert: fs.readFileSync('./server-certificate.pem')
};
var app = express();
var server = http.createServer(app);
var secureServer = https.createServer(ssl_options, app);
app.get('/', useHttp, function (req, res, next) {
res.send('<a href="/user/userA">Hello</a>')
});
app.get('/user/:name', useHttp, function (req, res, next) {
var user = req.params.name;
res.send('<a href="/login">Hello ' + user + '</a>')
});
app.get('/login', forceSSL, function (req, res, next) {
res.send('<a href="/">Hello</a><br/><a href="/logout">Goodbye</a>')
});
app.get('/logout', forceSSL, function (req, res, next) {
res.send('<a href="/">Hello</a>')
});
app.set('httpsPort', 9090);
app.set('httpPort', 8085);
secureServer.listen(9090)
server.listen(8085)
console.log('server started');
如您所见,我现在需要在所有路由中指定使用哪个协议:useHttp
用于 http
或 forceSSL
用于 https
。
虽然我对这个解决方案一点也不满意,因为我必须在所有路由中指定我想要的协议类型。但至少它有效。因此,如果有人找到任何其他解决方案,我将非常高兴,例如,在中间件层中添加一个函数来管理所有 http
请求,并在使用 forceSSL
指定时重定向到 https
.到目前为止,这有效。