【node】express請求http與https一起能訪問
阿新 • • 發佈:2018-12-15
前言
當你有一個雲伺服器主機,你會怎麼辦,即時你是一名前端。在阿里申請免費的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);
}
})