การเชื่อมต่อ HTTPS อัตโนมัติ / เปลี่ยนเส้นทางพร้อม node.js / express


182

ฉันพยายามตั้งค่า HTTPS ด้วยโปรเจ็กต์ node.js ที่ฉันกำลังทำงานอยู่ ฉันได้ปฏิบัติตามเอกสารประกอบ node.jsเป็นหลักสำหรับตัวอย่างนี้

// curl -k https://localhost:8000/
var https = require('https');
var fs = require('fs');

var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);

ตอนนี้เมื่อฉันทำ

curl -k https://localhost:8000/

ฉันเข้าใจ

hello world

อย่างที่คาดไว้. แต่ถ้าฉันทำ

curl -k http://localhost:8000/

ฉันเข้าใจ

curl: (52) Empty reply from server

เมื่อมองย้อนกลับไปจะเห็นได้ชัดว่ามันใช้งานได้ แต่ในเวลาเดียวกันผู้ที่มาเยี่ยมโครงการของฉันจะไม่พิมพ์ในhttps : // yadayada และฉันต้องการให้ปริมาณการใช้งานทั้งหมดเป็น https จากช่วงเวลาที่พวกเขาเข้าชม เว็บไซต์

ฉันจะรับโหนด (และ Express ตามที่เป็นเฟรมเวิร์กที่ฉันกำลังใช้) เพื่อส่งทราฟฟิกขาเข้าทั้งหมดไปยัง https ได้ไม่ว่าจะมีการระบุหรือไม่ ฉันไม่พบเอกสารใด ๆ ที่ระบุถึงเรื่องนี้ หรือเป็นเพียงการสันนิษฐานว่าในสภาพแวดล้อมการผลิตโหนดมีบางสิ่งที่อยู่ข้างหน้า (เช่น nginx) ที่จัดการการเปลี่ยนเส้นทางชนิดนี้

นี่คือการโจมตีครั้งแรกของฉันในการพัฒนาเว็บไซต์ดังนั้นโปรดให้อภัยความไม่รู้ของฉันหากนี่เป็นสิ่งที่ชัดเจน


ได้ตอบคำถามนี้อย่างชัดเจนที่นี่: stackoverflow.com/a/23894573/1882064
arcseldon

3
สำหรับใครก็ตามที่ใช้ HEROKU คำตอบในคำถามนี้จะไม่ช่วยคุณ (คุณจะได้รับ "การเปลี่ยนเส้นทางมากเกินไป") แต่คำตอบนี้จากคำถามอื่นจะ
Rico Kahler

คำตอบ:


179

Ryan ขอบคุณที่ชี้นำฉันในทิศทางที่ถูกต้อง ฉันได้คำตอบของคุณ (ย่อหน้าที่ 2) เล็กน้อยด้วยรหัสและใช้งานได้ ในสถานการณ์นี้โค้ดเหล่านี้ใส่ในแอพด่วนของฉัน:

// set up plain http server
var http = express.createServer();

// set up a route to redirect http to https
http.get('*', function(req, res) {  
    res.redirect('https://' + req.headers.host + req.url);

    // Or, if you don't want to automatically detect the domain name from the request header, you can hard code it:
    // res.redirect('https://example.com' + req.url);
})

// have it listen on 8080
http.listen(8080);

เซิร์ฟเวอร์ https express ฟัง ATM ใน 3000 ฉันตั้งค่ากฎ iptables เหล่านี้เพื่อให้โหนดไม่ต้องทำงานเป็นรูต:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3000

ทั้งหมดนี้ทำงานร่วมกันได้อย่างที่ฉันต้องการ


15
คำถามที่สำคัญมาก (เกี่ยวกับความปลอดภัย) ก่อนที่การเปลี่ยนเส้นทางจะเกิดขึ้นจริงเป็นไปได้หรือไม่ที่ผู้โจมตีจะดมกลิ่นและขโมยคุกกี้ (รหัสเซสชัน)
Costa

4
ฉันจะแก้ไขอาการที่เกิดขึ้นนี้ได้อย่างไร Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects
bodine

16
ที่จริงแล้วดูเหมือนดีกว่านี้ ... แค่ปิดการเปลี่ยนเส้นทางด้วยif(!req.secure){}
bodine

6
ฉันแค่อยากจะชี้ให้เห็นคำตอบสำหรับคำถามที่สำคัญของ @ Costa เกี่ยวกับความปลอดภัยที่โพสต์ไว้ในอีกโพสต์ - stackoverflow.com/questions/8605720/…
ThisClark

2
อาจต้องการล้อมรอบif(req.protocol==='http')คำสั่ง
สูงสุด

120

หากคุณติดตามพอร์ตทั่วไปเนื่องจาก HTTP ลองพอร์ต 80 ตามค่าเริ่มต้นและ HTTPS พยายามพอร์ต 443 โดยค่าเริ่มต้นคุณสามารถมีเซิร์ฟเวอร์สองเครื่องในเครื่องเดียวกันได้: นี่คือรหัส:

var https = require('https');

var fs = require('fs');
var options = {
    key: fs.readFileSync('./key.pem'),
    cert: fs.readFileSync('./cert.pem')
};

https.createServer(options, function (req, res) {
    res.end('secure!');
}).listen(443);

// Redirect from http port 80 to https
var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url });
    res.end();
}).listen(80);

ทดสอบด้วย https:

$ curl https://127.0.0.1 -k
secure!

ด้วย http:

$ curl http://127.0.0.1 -i
HTTP/1.1 301 Moved Permanently
Location: https://127.0.0.1/
Date: Sun, 01 Jun 2014 06:15:16 GMT
Connection: keep-alive
Transfer-Encoding: chunked

รายละเอียดเพิ่มเติม: Nodejs HTTP และ HTTPS ผ่านพอร์ตเดียวกัน


4
res.writeHead(301, etc.)ทำงานได้อย่างถูกต้องสำหรับการเรียก GET เท่านั้นเนื่องจาก301ไม่ได้บอกให้ลูกค้าใช้วิธีการเดียวกัน หากคุณต้องการที่จะให้วิธีการที่ใช้ (และทุกพารามิเตอร์อื่น ๆ ) res.writeHead(307, etc.)คุณต้องใช้ และถ้ามันยังใช้งานไม่ได้คุณอาจต้องทำพร็อกซี ที่มา: http://stackoverflow.com/a/17612942/1876359
ocramot

113

ขอขอบคุณผู้ชายคนนี้: https://www.tonyerwin.com/2014/09/redirecting-http-to-https-with-nodejs.html

app.use (function (req, res, next) {
        if (req.secure) {
                // request was via https, so do no special handling
                next();
        } else {
                // request was via http, so redirect to https
                res.redirect('https://' + req.headers.host + req.url);
        }
});

11
นี่คือคำตอบที่ดีที่สุด!
Steffan

3
เห็นด้วยควรเป็นคำตอบแรก
1984

12
บรรทัดต่อไปนี้ช่วยโซลูชันนี้ใช้งานได้สำหรับฉัน:app.enable('trust proxy');
arbel03

2
ตามที่ระบุไว้ข้างต้น ^^^^: จำเป็นต้องใช้ 'พร็อกซีที่เชื่อถือได้' หากคุณอยู่หลังพร็อกซีไฟร์วอลล์หรือโหลดบาลานเซอร์ทุกประเภทที่เปลี่ยนเส้นทางการรับส่งข้อมูล: เช่น AWS load balancing ซึ่งส่งคำขอ http & https ทั้งหมดไปยังพอร์ตที่ไม่ใช่รูทเดียวกัน (เช่น 3000) บนเว็บเซิร์ฟเวอร์ของ VPC ของคุณ
alanwaring

1
สำหรับการใช้ AWS ELB app.get('X-Forwarded-Proto') != 'http'แทนreq.secure aws.amazon.com/premiumsupport/knowledge-center/ ......
เขย่า

25

ด้วย Nginx คุณสามารถใช้ประโยชน์จากส่วนหัว "x-forwarded-proto":

function ensureSec(req, res, next){
    if (req.headers["x-forwarded-proto"] === "https"){
       return next();
    }
    res.redirect("https://" + req.headers.host + req.url);  
}

5
ฉันพบ req.headers ["x-forwarded-proto"] === "https") ไม่น่าเชื่อถือ แต่ req.secure ทำงานได้!
Zugwalt

ฉันพบสิ่งนี้ดูเหมือนว่าไม่น่าเชื่อถือมาก
dacopenhagen

2
req.secure เป็นวิธีที่เหมาะสมอย่างไรก็ตามนี่เป็นบั๊กหากคุณอยู่หลังพร็อกซีเพราะ req.secure เทียบเท่ากับโปรโต == "https" อย่างไรก็ตามหลังพร็อกซีเอ็กซ์เพรสอาจบอกว่าโปรโตของคุณคือ https, http
dacopenhagen

7
คุณต้องapp.enable('trust proxy');: "ระบุว่าแอพนั้นอยู่หลังพร็อกซีหันหน้าและใช้ส่วนหัว X-Forwarded- * เพื่อตรวจสอบการเชื่อมต่อและที่อยู่ IP ของลูกค้า" expressjs.com/th/4x/api.html#app.set
dskrvk

อย่าถือว่า URL เป็นสตริงใช้โมดูล url แทน
arboreal84

12

ตั้งแต่ 0.4.12 เราไม่มีวิธีการฟัง HTTP & HTTPS บนพอร์ตเดียวกันโดยใช้เซิร์ฟเวอร์ HTTP / HTTPS ของโหนด

บางคนได้แก้ไขปัญหานี้โดยการมีเซิร์ฟเวอร์ HTTPS ของ Node (ใช้งานได้กับ Express.js เช่นกัน) ฟัง 443 (หรือพอร์ตอื่น ๆ ) และยังมีเซิร์ฟเวอร์ http ขนาดเล็กผูกกับ 80 และเปลี่ยนเส้นทางผู้ใช้ไปยังพอร์ตที่ปลอดภัย

หากคุณจำเป็นต้องจัดการโปรโตคอลทั้งสองบนพอร์ตเดียวคุณต้องใส่ nginx, lighttpd, apache หรือเว็บเซิร์ฟเวอร์อื่น ๆ บนพอร์ตนั้นและทำหน้าที่เป็น reverse proxy for Node


ขอบคุณไรอัน โดย "... มีการผูก http เซิร์ฟเวอร์ขนาดเล็กถึง 80 และเปลี่ยนเส้นทาง ..." ผมถือว่าคุณหมายถึงอีกโหนดเซิร์ฟเวอร์ http ฉันคิดว่าฉันมีความคิดเกี่ยวกับวิธีการทำงานนี้ แต่คุณสามารถชี้ไปที่รหัสตัวอย่างได้หรือไม่ นอกจากนี้คุณทราบหรือไม่ว่าโซลูชันที่ "สะอาดกว่า" สำหรับปัญหานี้อยู่ที่ใดก็ตามในแผนการทำงานของโหนดหรือไม่
Jake

แอปพลิเคชัน Node.js ของคุณสามารถมีเซิร์ฟเวอร์ http ได้หลายตัว ฉันตรวจสอบปัญหาของ Node.js ( github.com/joyent/node/issues ) และรายชื่อผู้รับจดหมาย ( groups.google.com/group/nodejs ) และไม่เห็นปัญหาใด ๆ ที่รายงาน แต่เห็นโพสต์คู่เกี่ยวกับปัญหา ในรายชื่อผู้รับจดหมาย เท่าที่ฉันสามารถบอกได้ว่านี่ไม่ได้อยู่ในท่อ ฉันอยากจะแนะนำการรายงานบน gitHub และดูว่าคุณได้รับข้อเสนอแนะอะไร
Ryan Olds

คำถามที่สำคัญมาก (เกี่ยวกับความปลอดภัย) ก่อนที่การเปลี่ยนเส้นทางจะเกิดขึ้นจริงเป็นไปได้หรือไม่ที่ "ผู้โจมตี" จะดมกลิ่นและขโมยคุกกี้ (รหัสเซสชัน)
Costa

ใช่รหัสสถานะ 3xx และส่วนหัว Location อาจถูกส่งกลับไปยังเอเจนต์ซึ่งเป็นจุดที่เอเจนต์ร้องขอ URL ที่ระบุโดยส่วนหัว Location
Ryan Olds

ปี 2558 มันยังเป็นเช่นนี้อยู่หรือเปล่า?
วิเคราะห์สิ่งแวดล้อม

10

คุณสามารถใช้โมดูลexpress-force-https :

npm install --save express-force-https

var express = require('express');
var secure = require('express-force-https');

var app = express();
app.use(secure);

1
ใช้สิ่งนี้ด้วยความระมัดระวังเนื่องจากแพคเกจยังไม่ได้รับการปรับปรุงในปี ฉันพบปัญหาใน AWS ที่การเข้ารหัสไม่ดี
Martavis P.

1
แพคเกจน้องสาว: npmjs.com/package/express-to-https - แต่ฉันไม่รู้ว่ามันทำงานได้ดีกว่า / isbetter / etc
quetzalcoatl

โปรดทราบว่าหากคุณใช้มิดเดิลแวร์ในการให้บริการไฟล์คงที่ (รวมถึงแอพพลิเคชั่นหน้าเดียว) มิดเดิลแวร์การเปลี่ยนเส้นทางใด ๆ จะต้องแนบมาappก่อน (ดูคำตอบนี้ )
แมทธิวอาร์

9

ฉันใช้วิธีแก้ปัญหาที่เสนอโดย Basarat แต่ฉันต้องเขียนทับพอร์ตเพราะเคยมี 2 พอร์ตที่แตกต่างกันสำหรับโปรโตคอล HTTP และ HTTPS

res.writeHead(301, { "Location": "https://" + req.headers['host'].replace(http_port,https_port) + req.url });

ฉันชอบที่จะใช้ไม่ใช่พอร์ตมาตรฐานเพื่อเริ่ม nodejs โดยไม่มีสิทธิ์รูท ฉันชอบ 8080 และ 8443 เพราะฉันมาจากการเขียนโปรแกรม Tomcat เป็นเวลาหลายปี

ไฟล์ทั้งหมดของฉันกลายเป็น

var fs = require('fs');
var http = require('http');
var http_port    =   process.env.PORT || 8080; 
var app = require('express')();

// HTTPS definitions
var https = require('https');
var https_port    =   process.env.PORT_HTTPS || 8443; 
var options = {
   key  : fs.readFileSync('server.key'),
   cert : fs.readFileSync('server.crt')
};

app.get('/', function (req, res) {
   res.send('Hello World!');
});

https.createServer(options, app).listen(https_port, function () {
   console.log('Magic happens on port ' + https_port); 
});

// Redirect from http port to https
http.createServer(function (req, res) {
    res.writeHead(301, { "Location": "https://" + req.headers['host'].replace(http_port,https_port) + req.url });
    console.log("http request, will go to >> ");
    console.log("https://" + req.headers['host'].replace(http_port,https_port) + req.url );
    res.end();
}).listen(http_port);

จากนั้นฉันใช้ iptable เพื่อบอกอัตราการรับส่งข้อมูล 80 และ 443 บนพอร์ต HTTP และ HTTPS ของฉัน

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8443

ขอบคุณ Lorenzo สิ่งนี้ใช้ได้สำหรับฉัน แทนที่จะใช้ตัวเลือกฉันใช้ letsencrypt ฉันลบตัวเลือก var ฉันได้เพิ่มพารามิเตอร์ allowencrypt (privateKey, ใบรับรอง, ca, และหนังสือรับรอง) และฉันเปลี่ยนตัวเลือกเป็นข้อมูลรับรอง: https.createServer (หนังสือรับรอง, แอป)
Nhon Ha

8

คำตอบนี้จำเป็นต้องได้รับการอัพเดตให้ทำงานกับ Express 4.0 นี่คือวิธีที่ฉันได้รับเซิร์ฟเวอร์ http แยกทำงาน:

var express = require('express');
var http = require('http');
var https = require('https');

// Primary https app
var app = express()
var port = process.env.PORT || 3000;
app.set('env', 'development');
app.set('port', port);
var router = express.Router();
app.use('/', router);
// ... other routes here
var certOpts = {
    key: '/path/to/key.pem',
    cert: '/path/to/cert.pem'
};
var server = https.createServer(certOpts, app);
server.listen(port, function(){
    console.log('Express server listening to port '+port);
});


// Secondary http app
var httpApp = express();
var httpRouter = express.Router();
httpApp.use('*', httpRouter);
httpRouter.get('*', function(req, res){
    var host = req.get('Host');
    // replace the port in the host
    host = host.replace(/:\d+$/, ":"+app.get('port'));
    // determine the redirect destination
    var destination = ['https://', host, req.url].join('');
    return res.redirect(destination);
});
var httpServer = http.createServer(httpApp);
httpServer.listen(8080);

1
ฉันได้รับการทำงานโดยการเปลี่ยน httpApp.use ('*', httpRouter); ถึง httpApp.use ('/', httpRouter); และย้ายไปยังบรรทัดก่อนที่คุณจะสร้างเซิร์ฟเวอร์ hhtp
KungWaz

8

หากแอปของคุณอยู่หลังพร็อกซีที่เชื่อถือได้ (เช่น AWS ELB หรือ nginx ที่กำหนดค่าอย่างถูกต้อง) รหัสนี้ควรใช้งานได้:

app.enable('trust proxy');
app.use(function(req, res, next) {
    if (req.secure){
        return next();
    }
    res.redirect("https://" + req.headers.host + req.url);
});

หมายเหตุ:

  • สมมติว่าคุณโฮสต์ไซต์ของคุณใน 80 และ 443 ถ้าไม่คุณจะต้องเปลี่ยนพอร์ตเมื่อคุณเปลี่ยนเส้นทาง
  • นอกจากนี้ยังถือว่าคุณกำลังยกเลิก SSL บนพรอกซี หากคุณกำลังใช้ SSL ตั้งแต่ต้นจนจบใช้คำตอบจาก @basarat ด้านบน End to end SSL เป็นทางออกที่ดีกว่า
  • app.enable ('trust proxy') อนุญาตให้ express ตรวจสอบส่วนหัว X-Forwarded-Proto

6

ฉันพบ req.protocol ทำงานเมื่อฉันใช้ express (ยังไม่ได้ทดสอบโดยไม่ต้องมี แต่ฉันสงสัยว่ามันใช้งานได้) ใช้โหนดปัจจุบัน 0.10.22 กับด่วน 3.4.3

app.use(function(req,res,next) {
  if (!/https/.test(req.protocol)){
     res.redirect("https://" + req.headers.host + req.url);
  } else {
     return next();
  } 
});

5

คำตอบส่วนใหญ่ที่นี่แนะนำให้ใช้ส่วนหัว req.headers.host

ส่วนหัวของโฮสต์จำเป็นต้องใช้ HTTP 1.1 แต่จริง ๆ แล้วเป็นทางเลือกเนื่องจากส่วนหัวอาจไม่ได้รับการส่งโดยไคลเอนต์ HTTP จริง ๆ และโหนด / ด่วนจะยอมรับคำขอนี้

คุณอาจถาม: ไคลเอนต์ HTTP ใด (เช่นเบราว์เซอร์) สามารถส่งคำขอที่ไม่มีส่วนหัวนั้นได้ โปรโตคอล HTTP นั้นสำคัญมาก คุณสามารถสร้างคำขอ HTTP ในโค้ดไม่กี่บรรทัดเพื่อไม่ให้ส่งส่วนหัวของโฮสต์และหากคุณได้รับคำขอที่มีรูปแบบไม่ถูกต้องทุกครั้งที่คุณส่งข้อยกเว้นและขึ้นอยู่กับวิธีจัดการกับข้อยกเว้นดังกล่าว

ดังนั้นมักจะตรวจสอบทุกท่าน นี่ไม่ใช่ความหวาดระแวงฉันได้รับคำขอที่ไม่มีส่วนหัวของโฮสต์ในบริการของฉัน

นอกจากนี้ไม่เคยรักษา URL ที่เป็นสตริง ใช้โมดูลโหนด url เพื่อแก้ไขส่วนเฉพาะของสตริง การจัดการ URL เป็นสตริงสามารถใช้ประโยชน์ได้หลายวิธี อย่าทำมัน


คำตอบของคุณจะสมบูรณ์แบบถ้าคุณได้รับตัวอย่าง
SerG

ฟังดูดี แต่การอ้างอิง / ลิงก์บางอย่างก็ยอดเยี่ยม
Giwan

3
var express = require('express');
var app = express();

app.get('*',function (req, res) {
    res.redirect('https://<domain>' + req.url);
});

app.listen(80);

นี่คือสิ่งที่เราใช้และใช้งานได้ดี!


1
อย่าถือว่า URL เป็นสตริงใช้โมดูล url แทน
arboreal84

4
ยกตัวอย่างที่แสดงถึงความรับผิดชอบ Stack overflow เป็นเกมโทรศัพท์
84

1
สิ่งนี้จะไม่ทำให้เกิดการวนซ้ำไม่สิ้นสุด?
มูฮัมหมัดอูเมอ

ไม่เพราะฟังในพอร์ต 80 เท่านั้นและส่งไปยังพอร์ต 443 วิธีเดียวที่จะเกิดลูปไม่สิ้นสุดคือหากผู้ฟังบางรายใน 443 เปลี่ยนเส้นทางกลับไปที่ 80 ซึ่งไม่ได้อยู่ในรหัสของฉัน ฉันหวังว่ามันสมเหตุสมผล ขอบคุณ!
Nick Kotenberg

3

คุณสามารถใช้โมดูล "net" เพื่อฟัง HTTP & HTTPS ในพอร์ตเดียวกัน

var https = require('https');
var http = require('http');
var fs = require('fs');

var net=require('net');
var handle=net.createServer().listen(8000)

var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(handle);

http.createServer(function(req,res){
  res.writeHead(200);
  res.end("hello world\n");
}).listen(handle)

5
เมื่อฉันเรียกใช้สิ่งนี้ใน Node 0.8 มีเพียงเซิร์ฟเวอร์สุดท้ายที่เรียกใช้. listen ดูเหมือนว่าจะตอบ ในกรณีนี้ HTTP ใช้งานได้ แต่ไม่ใช่ HTTPS ถ้าฉันกลับคำสั่งของ. สร้างเซิร์ฟเวอร์จากนั้น HTTP ใช้งานได้ แต่ไม่ใช่ HTTPS :(
Joe

1
สิ่งนี้ไม่ทำงานตามที่อธิบายไว้ ฉันสามารถยืนยันปัญหาที่โจเห็น
Stepan Mazurov

2

สิ่งนี้ใช้ได้กับฉัน:

app.use(function(req,res,next) {
    if(req.headers["x-forwarded-proto"] == "http") {
        res.redirect("https://[your url goes here]" + req.url, next);
    } else {
        return next();
    } 
});

สิ่งนี้อาจถูกต้อง แต่คุณควรให้รายละเอียดเกี่ยวกับวิธีการตอบคำถามของผู้ถาม
Joe C

1

คุณสามารถยกตัวอย่างเซิร์ฟเวอร์ 2 Node.js - หนึ่งอันสำหรับ HTTP และ HTTPS

นอกจากนี้คุณยังสามารถกำหนดฟังก์ชั่นการติดตั้งที่เซิร์ฟเวอร์ทั้งสองจะทำงานเพื่อที่คุณจะได้ไม่ต้องเขียนโค้ดซ้ำ

นี่คือวิธีที่ฉันทำ: (ใช้ restify.js แต่ควรใช้ได้กับ express.js หรือโหนดเอง)

http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/


0

สิ่งนี้ใช้ได้กับฉัน:

/* Headers */
require('./security/Headers/HeadersOptions').Headers(app);

/* Server */
const ssl = {
    key: fs.readFileSync('security/ssl/cert.key'),
    cert: fs.readFileSync('security/ssl/cert.pem')
};
//https server
https.createServer(ssl, app).listen(443, '192.168.1.2' && 443, '127.0.0.1');
//http server
app.listen(80, '192.168.1.2' && 80, '127.0.0.1');
app.use(function(req, res, next) {
    if(req.secure){
        next();
    }else{
        res.redirect('https://' + req.headers.host + req.url);
    }
});

แนะนำให้เพิ่มส่วนหัวก่อนที่จะเปลี่ยนเส้นทางไปที่ https

ตอนนี้เมื่อคุณ:

curl http://127.0.0.1 --include

คุณได้รับ:

HTTP/1.1 302 Found
//
Location: https://127.0.0.1/
Vary: Accept
Content-Type: text/plain; charset=utf-8
Content-Length: 40
Date: Thu, 04 Jul 2019 09:57:34 GMT
Connection: keep-alive

Found. Redirecting to https://127.0.0.1/

ฉันใช้ express 4.17.1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.