前言
当你有一个云服务器主机,你会怎么办,即时你是一名前端。在阿里申请免费的https的ssl证书,在node跑起来了,但是http却不能跑了,是不是很气了。下面就开始今天的任务吧。
实战
请按照下面步骤,请求 http或https 。然后进行重定向。
此处使用真正的服务器。下面是通过代理进行将http与https的进行统一一个端口。访问的时候,你可以访问 http或者https请求头。下面是bin目录下的 www 文件中写的东西:
第一步:创建两个服务器
在bin目录下的www文件中,创建两个不同端口的服务器。
var app = require('../app');
var debug = require('debug')('my:server');
var https = require('https');
var http = require('http');
var httpsPort = 5887; // 自定义数字端口,给https用的端口
var httpPort = 5888; // 自定义数字端口
// 1、创建https服务器
var privateKey = fs.readFileSync('./bin/keys/215042742390100.key', 'utf8');
var certificate = fs.readFileSync('./bin/keys/215042742390100.pem', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var httpsServer = https.createServer(credentials,app);
httpsServer.listen(httpsPort);
// 2、创建http服务器
var server = http.createServer(app).listen(httpPort);
第二步:使用 net 进行代理成一个端口
接下来还是在www文件中引入 net 依赖,通过 net 进行监听两个端口的,分别进行请求发给你要定义的端口服务器。
// 1、引入依赖
var net = require('net'); // 使用代理
// 2、创建服务器进行代理
net.createServer(function(socket){
socket.once('data', function(buf){
console.log(buf[0]);
// https数据流的第一位是十六进制“16”,转换成十进制就是22
var address = buf[0] === 22 ? httpsPort : httpPort;
//创建一个指向https或http服务器的链接
var proxy = net.createConnection(address, function() {
proxy.write(buf);
//反向代理的过程,tcp接受的数据交给代理链接,代理链接服务器端返回数据交由socket返回给客户端
socket.pipe(proxy).pipe(socket);
});
proxy.on('error', function(err) {
console.log(err);
});
});
socket.on('error', function(err) {
console.log(err);
});
},app).listen(5857); // 此处是真正能够访问的端口,网站默认是80端口。
整合上面的第一步和第二步 www 文件代码。
var net = require('net'); // 使用代理
var app = require('../app');
var debug = require('debug')('my:server');
var https = require('https');
var http = require('http');
var httpsPort = 5887; // 自定义
var httpPort = 5888; // 自定义
// 第一步:https
var privateKey = fs.readFileSync('./bin/keys/215042742390100.key', 'utf8');
var certificate = fs.readFileSync('./bin/keys/215042742390100.pem', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var httpsServer = https.createServer(credentials,app);
httpsServer.listen(httpsPort);
// 第二步:http
var server = http.createServer(app).listen(httpPort);
// 2、创建服务器进行代理
net.createServer(function(socket){
socket.once('data', function(buf){
console.log(buf[0]);
// https数据流的第一位是十六进制“16”,转换成十进制就是22
var address = buf[0] === 22 ? httpsPort : httpPort;
//创建一个指向https或http服务器的链接
var proxy = net.createConnection(address, function() {
proxy.write(buf);
//反向代理的过程,tcp接受的数据交给代理链接,代理链接服务器端返回数据交由socket返回给客户端
socket.pipe(proxy).pipe(socket);
});
proxy.on('error', function(err) {
console.log(err);
});
});
socket.on('error', function(err) {
console.log(err);
});
},app).listen(5857); // 此处是真正能够访问的端口,网站默认是80端口。
写完代码后保存,记得重启下服务器,才能看到效果
第三步: 重定向
找到app.js 文件中,我们需要的是在路由 * 和 / 中进行重新 重定向。
// 1、引入express的路由模块
var router = express.Router({
caseSensitive:true // 开启大小写
});
// 这个是所有的路由,必定会走这里。
router.all('*',function(req, res, next) {
// 判断当前的请求头是 http的话
if(req.protocol == 'http'){
// 进行重定向。
res.redirect('https://lolku.cn:5857'+req.originalUrl);
}
})