1. 程式人生 > >【node】express請求http與https一起能訪問

【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);
	}
})