【node】express请求http与https一起能访问

前言

当你有一个云服务器主机,你会怎么办,即时你是一名前端。在阿里申请免费的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);
	}
})


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值