স্বয়ংক্রিয় HTTPS সংযোগ / নোড.জেএস / এক্সপ্রেসের সাথে পুনর্নির্দেশ


182

আমি যে নোড.জেএস প্রকল্পে কাজ করছি তার সাথে এইচটিটিপিএস সেট আপ করার চেষ্টা করছি। আমি এই উদাহরণের জন্য নোড.জেএস ডকুমেন্টেশনটি মূলত অনুসরণ করেছি :

// 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 : // ইয়াদায়দাতে টাইপ করতে যাবেন না এবং আমি চাই যে সমস্ত ট্র্যাফিক তারা আঘাতের মুহুর্ত থেকেই https হোক to সাইটটি.

আমি কীভাবে নোড পেতে পারি (এবং আমি যে ফ্রেমওয়ার্কটি ব্যবহার করি সে হিসাবে এটি প্রকাশ করব) যা ইনকামিং সমস্ত ট্র্যাফিক https- এ সরিয়ে দেওয়া হয়েছে তা নির্ধারণ করা হয়েছে কিনা তা বিবেচনা করে? আমি এটিকে সম্বোধন করে এমন কোনও ডকুমেন্টেশন খুঁজে পাইনি। বা এটি কি কেবল ধরে নেওয়া হয়েছে যে কোনও উত্পাদন পরিবেশে নোডের সামনে এমন কিছু রয়েছে যা (যেমন এনজিনেক্স) এই ধরণের পুনঃনির্দেশকে পরিচালনা করে?

ওয়েব ডেভলপমেন্টে এটি আমার প্রথম প্রচার, তাই দয়া করে যদি কিছু স্পষ্ট হয় তবে আমার অজ্ঞতা ক্ষমা করুন।


: এই উত্তর দিলেন succinctly এখানে stackoverflow.com/a/23894573/1882064
arcseldon

3
যে কারও কাছে হিরোকু অবলম্বন করার জন্য, এই প্রশ্নের উত্তরগুলি আপনাকে সাহায্য করবে না (আপনি "অনেকগুলি পুনর্নির্দেশ" পাবেন) তবে অন্য একটি প্রশ্নের উত্তরটি হবে
রিকো কাহার

উত্তর:


179

রায়ান, আমাকে সঠিক দিকে নির্দেশ করার জন্য ধন্যবাদ। আমি আপনার উত্তর (২ য় অনুচ্ছেদ) কিছু কোড সহ সামান্য বিভক্ত করেছি এবং এটি কার্যকর হয়। এই পরিস্থিতিতে এই কোড স্নিপেটগুলি আমার এক্সপ্রেস অ্যাপ্লিকেশনটিতে রাখা হয়েছে:

// 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 এক্সপ্রেস সার্ভার 3000 এ এটিএম শোনে I আমি এই 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
সত্যিই গুরুত্বপূর্ণ প্রশ্ন (সুরক্ষা সম্পর্কিত)। পুনঃনির্দেশ আসলে ঘটে যাওয়ার আগে, আক্রমণকারীর পক্ষে কী কোনও কুকি (সেশন আইডি) স্নিগ্ধ করে চুরি করা সম্ভব?
কোস্টা

4
আমি এই ফলস্বরূপ লক্ষণটি কীভাবে ঠিক করব? Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects
bodine

16
আসলে, এটা উত্তম বলে মনে হয় , ... শুধু পুনর্নির্দেশ সঙ্গে মোড়ানোif(!req.secure){}
bodine

6
- আমি শুধু @ অন্য একটা পোস্টে দেওয়া নিরাপত্তা সম্পর্কে কোস্টা গুরুত্বপূর্ণ প্রশ্নের উত্তর বাতলান করতে চান stackoverflow.com/questions/8605720/...
ThisClark

2
একটি চারপাশে মোড়ানো করতে চাইতে পারেন if(req.protocol==='http')বিবৃতি
ম্যাক্স

120

আপনি যদি প্রচলিত বন্দরগুলি অনুসরণ করেন যেহেতু HTTP ডিফল্ট দ্বারা পোর্ট ৮০ চেষ্টা করে এবং 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!

এইচটিপি সহ:

$ 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

আরও বিশদ: একই পোর্টের উপর নোডেজ এইচটিটিপি এবং এইচটিটিপিএস


4
res.writeHead(301, etc.)301ক্লায়েন্টকে একই পদ্ধতি ব্যবহার করতে বলছে না বলেই কেবল জিইটি কলগুলির জন্য সঠিকভাবে কাজ করছে । আপনি যদি পদ্ধতিটি ব্যবহার করতে চান (এবং অন্যান্য সমস্ত পরামিতি) ব্যবহার করতে হয় res.writeHead(307, etc.)। এবং যদি এটি এখনও কাজ না করে, আপনাকে কিছু প্রক্সিং করতে হবে। সূত্র: http://stackoverflow.com/a/17612942/1876359
অক্রামোট

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
এটাই সেরা উত্তর!
স্টিফান

3
সম্মত, প্রথম উত্তর হওয়া উচিত।
1984

12
নিম্নলিখিত লাইনটি আমার জন্য এই সমাধান কাজ করতে সহায়তা করেছে:app.enable('trust proxy');
arbel03

2
উপরে বর্ণিত হিসাবে ^^^^: 'ট্রাফিক প্রক্সি' প্রয়োজনীয় যদি আপনি কোনও ধরণের প্রক্সি, ফায়ারওয়াল বা লোড ব্যালান্সারের পিছনে থাকেন যা ট্র্যাফিক পুনঃনির্দেশ করে: যেমন AWS লোড ব্যালেন্সিং যা সমস্ত http & https অনুরোধগুলি একই অ-রুট পোর্টে প্রেরণ করে (যেমন, 3000) আপনার ভিপিসির ওয়েব সার্ভারে।
22:53 এ অ্যালানওয়ারিং war

1
জন্য Aws ELB ব্যবহার app.get('X-Forwarded-Proto') != 'http'পরিবর্তে req.secure aws.amazon.com/premiumsupport/knowledge-center/...
Shak

25

এনগিনেক্সের সাহায্যে আপনি "এক্স-ফরওয়ার্ড-প্রোটো" শিরোনামের সুবিধা নিতে পারেন:

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- ফরওয়ার্ড-প্রোটো"] === "https") নির্ভরযোগ্য না হওয়ার জন্য, তবে req.secure কাজ করে!
জুগওয়াল্ট

আমি একই দেখতে পেয়েছি, এটি খুব বিশ্বাসযোগ্য নয় appears
ডকোপেনহেগেন

2
req.secure হ'ল সঠিক উপায়, তবে আপনি যদি প্রক্সিটির পিছনে থাকেন তবে এটি বগী কারণ req.secure প্রোটো == "https" এর সমতুল্য, তবে একটি প্রক্সি এক্সপ্রেসের পিছনে বলতে পারে আপনার
প্রোটোটি

7
আপনার প্রয়োজন app.enable('trust proxy');: "অ্যাপ্লিকেশনটি সম্মুখ মুখী প্রক্সিটির পিছনে ইঙ্গিত করে এবং ক্লায়েন্টের সংযোগ এবং আইপি ঠিকানা নির্ধারণ করতে এক্স-ফরওয়ার্ডেড * * শিরোনাম ব্যবহার করতে হবে" " expressjs.com/en/4x/api.html#app.set
dskrvk

Url কে স্ট্রিং হিসাবে ব্যবহার করবেন না, পরিবর্তে url মডিউলটি ব্যবহার করুন।
arboreal84

12

0.4.12 হিসাবে আমাদের কাছে নোডের এইচটিটিপি / এইচটিটিপিএস সার্ভারগুলি ব্যবহার করে একই বন্দরে এইচটিটিপি এবং এইচটিটিপিএস শোনার কোনও আসল পরিষ্কার উপায় নেই।

কিছু লোক নোডের এইচটিটিপিএস সার্ভার থাকার কারণে (এটি এক্সপ্রেস.জেএস এর সাথেও কাজ করে) 443 (বা অন্য কোনও পোর্ট) শোনার সাথে সাথে একটি ছোট HTTP সার্ভার বাইন্ডে 80 রেখে এবং ব্যবহারকারীদের সুরক্ষিত বন্দরে পুনর্নির্দেশ করে এই সমস্যার সমাধান করেছে।

যদি আপনাকে একক বন্দরে উভয় প্রোটোকল হ্যান্ডেল করতে সক্ষম হয় তবে আপনাকে সেই বন্দরে এনজিনেক্স, লাইটটিপিডি, অ্যাপাচি, বা অন্য কোনও ওয়েব সার্ভার স্থাপন করতে হবে এবং নোডের বিপরীত প্রক্সি হিসাবে কাজ করতে হবে।


ধন্যবাদ রায়ান "... দ্বারা একটি ছোট HTTP সার্ভারটি 80 এ আবদ্ধ করুন এবং পুনর্নির্দেশ করুন ..." আমি ধরে নিয়েছি আপনার অর্থ অন্য নোড HTTP সার্ভার। আমি মনে করি এটি কীভাবে কাজ করে তা সম্পর্কে আমার ধারণা আছে তবে আপনি কোনও উদাহরণ কোডটিতে নির্দেশ করতে পারেন? এছাড়াও, আপনি কি জানেন যে এই সমস্যাটির একটি "ক্লিনার" সমাধান নোড রোডম্যাপের কোথাও রয়েছে?
জেক 4

আপনার নোড.জেএস অ্যাপ্লিকেশনটিতে একাধিক http (গুলি) সার্ভার থাকতে পারে। আমি নোড.জেএস সমস্যাগুলি ( github.com/joyent/node/issues ) এবং মেলিং তালিকা (গ্রুপ. google.com/group/nodejs ) যাচাই করেছিলাম এবং কোনও সমস্যা প্রতিবেদন করা দেখিনি, তবে সমস্যা সম্পর্কে দুটি পোস্ট দেখেছি মেইলিং তালিকায়। আমি যতদূর বলতে পারি এটি পাইপে নেই। আমি গিথুব এ এটি রিপোর্ট করার এবং আপনি কী প্রতিক্রিয়া পাবেন তা দেখার পরামর্শ দিচ্ছি।
রায়ান ওল্ডস

সত্যিই গুরুত্বপূর্ণ প্রশ্ন (সুরক্ষা সম্পর্কিত)। পুনঃনির্দেশ আসলে ঘটে যাওয়ার আগে, "আক্রমণকারী" এর পক্ষে কী কোনও কুকি (সেশন আইডি) স্নিগ্ধ করে চুরি করা সম্ভব?
কোস্টা

হ্যাঁ, একটি 3xx স্থিতি কোড এবং সম্ভবত কোনও অবস্থানের শিরোনাম এজেন্টকে আবার প্রেরণ করা হয়, সেই সময়ে এজেন্ট লোকেশন শিরোনাম দ্বারা নির্দিষ্ট URL টি অনুরোধ করে।
রায়ান ওল্ডস

এটা 2015, এখনও কি এই অবস্থা?
দ্য পরিবেশবিদ

10

আপনি এক্সপ্রেস-ফোর্স-https মডিউলটি ব্যবহার করতে পারেন :

npm install --save express-force-https

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

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

1
এটি সাবধানতার সাথে ব্যবহার করুন কারণ প্যাকেজটি বছরের পর বছর আপডেট হয়নি। আমি এডাব্লুএস-এর সমস্যাগুলিতে ছুটে এসেছি যেখানে এনকোডিংটি খারাপ ছিল।
মার্টাভিস পি।

1
বোন প্যাকেজ: npmjs.com/package/express-to-https - তবে এটি /
ইসবেটার

মনে রাখবেন যে আপনি যদি স্ট্যাটিক ফাইলগুলি (একক পৃষ্ঠার অ্যাপ্লিকেশন সহ) পরিবেশন করতে মিডলওয়্যার ব্যবহার করছেন তবে যে কোনও পুনর্নির্দেশ মিডলওয়্যারটি অবশ্যই appপ্রথমে সংযুক্ত থাকতে হবে । ( এই উত্তর দেখুন )
ম্যাথু আর।

9

আমি বাসারাত দ্বারা প্রস্তাবিত সমাধানটি ব্যবহার করি তবে আমার বন্দরটিও ওভাররাইট করা দরকার কারণ আমার কাছে এইচটিটিপি এবং এইচটিটিপিএস প্রোটোকলের জন্য দুটি পৃথক পোর্ট ছিল।

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

আমি স্ট্যান্ডার্ড পোর্ট না ব্যবহার করতে পছন্দ করি তাই মূল সুযোগ ছাড়াই নোডেজ শুরু করতে। আমি 8080 এবং 8443 পছন্দ করি কারণ টমক্যাটে প্রচুর বছরের প্রোগ্রামিং থেকে এসেছি।

আমার সম্পূর্ণ ফাইল হয়ে যায়

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

তারপরে আমি আমার এইচটিটিপি এবং এইচটিটিপিএস পোর্টগুলিতে 80 এবং 443 ট্র্যাফিক রেকর্ডিংয়ের জন্য আইপটেবল ব্যবহার করি।

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

ধন্যবাদ লরেঞ্জো, এটি আমার পক্ষে কাজ করেছে। বিকল্পগুলি ব্যবহার করার পরিবর্তে, আমি লেটেনক্রিপটি ব্যবহার করেছি। আমি বিভিন্ন বিকল্প মুছে ফেলেছি। আমি লেটসনক্রিপ্ট প্যারামিটারগুলি (প্রাইভেটকি, শংসাপত্র, সিএ এবং শংসাপত্রগুলি) যুক্ত করেছি এবং আমি বিকল্পগুলিকে শংসাপত্রগুলিতে পরিবর্তন করেছি: https.createServer (শংসাপত্র, অ্যাপ)
Nhon হা

8

এক্সপ্রেস ৪.০ নিয়ে কাজ করার জন্য এই উত্তরটি আপডেট করা দরকার। কাজ করার জন্য আমি পৃথক 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) পরিবর্তন করে কাজ করতে পেরেছি; to httpApp.use ('/', httpRouter); এবং এইচটিএইচপি সার্ভার তৈরি করার আগে এটিকে লাইনে সরানো।
কুংওয়াজ

8

যদি আপনার অ্যাপ্লিকেশন কোনও বিশ্বস্ত প্রক্সি (যেমন একটি এডাব্লুএস ইএলবি বা একটি সঠিকভাবে কনফিগার করা এনজিনেক্স) এর পিছনে থাকে তবে এই কোডটি কাজ করা উচিত:

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 এ আপনার সাইটটি হোস্ট করছেন, যদি তা না হয়, আপনাকে পুনর্নির্দেশের সময় আপনার পোর্টটি পরিবর্তন করতে হবে
  • এটিও ধরে নিয়েছে যে আপনি প্রক্সিতে এসএসএলকে সমাপ্ত করছেন। আপনি যদি এসএসএল শেষ করতে শেষ করেন তবে উপরের @ বাসরত থেকে উত্তরটি ব্যবহার করুন। এন্ড টু এন্ড এসএসএল আরও ভাল সমাধান।
  • app.enable ('বিশ্বাস প্রক্সি') এক্স-ফরোয়ার্ড-প্রোটো শিরোনামটি এক্সপ্রেসকে অনুমতি দেয়

6

আমি যখন এক্সপ্রেস ব্যবহার করি তখন আমি রেক.প্রোটোকলগুলি কাজ করে দেখি (এটি ছাড়া পরীক্ষা করা হয়নি তবে আমার সন্দেহ হয় এটি কাজ করে)। এক্সপ্রেস 3.4.3 সহ বর্তমান নোড 0.10.22 ব্যবহার করে

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 দ্বারা আবশ্যক, তবে এটি আসলে বিকল্প since

আপনি জিজ্ঞাসা করতে পারেন: কোন HTTP ক্লায়েন্ট (যেমন: ব্রাউজার) সেই শিরোনাম অনুপস্থিত অনুরোধ পাঠাতে পারে? এইচটিটিপি প্রোটোকলটি খুব তুচ্ছ। কোনও হোস্ট শিরোলেখ না প্রেরণের জন্য আপনি কোডের কয়েকটি লাইনে এইচটিটিপি অনুরোধটি নৈপুণ্য বজায় রাখতে পারেন, এবং প্রতিবার আপনি যদি কোনও ত্রুটিযুক্ত অনুরোধ পান তবে আপনি একটি ব্যতিক্রম নিক্ষেপ করেন এবং আপনি যেমন এই ব্যতিক্রমগুলি পরিচালনা করেন তার উপর নির্ভর করে এটি আপনার সার্ভারটিকে নামিয়ে ফেলতে পারে।

সুতরাং সবসময় সমস্ত ইনপুট বৈধ করুন । এটি প্যারানোইয়া নয়, আমার পরিষেবাতে হোস্ট শিরোনামের অভাবের অনুরোধ পেয়েছি।

এছাড়াও, কখনও ইউআরএলকে স্ট্রিং হিসাবে ব্যবহার করবেন না । কোনও স্ট্রিংয়ের নির্দিষ্ট অংশগুলি সংশোধন করতে নোড url মডিউলটি ব্যবহার করুন। ইউআরএলকে স্ট্রিং হিসাবে ব্যবহার করা অনেকগুলি বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে। এটা করবেন না।


আপনার উত্তরটি নিখুঁত হবে যদি আপনি একটি উদাহরণ দিয়ে থাকেন।
সার্জ

বৈধ মনে হচ্ছে তবে কিছু উল্লেখ / লিঙ্কগুলি দুর্দান্ত।
জিওয়ান

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
দায়িত্ববোধের সাথে উদাহরণ দিন। স্ট্যাক ওভারফ্লো হল টেলিফোন গেম।
arboreal84

1
এই অসীম লুপ কারণ না?
মুহাম্মদ উমার

না, কারণ এটি কেবল 80 বন্দরটিতে শোনা যায় এবং 443 পোর্টে প্রেরণ করে 44 443-তে কিছু শ্রোতা যদি আমার কোডে নেই তবে 80 এ পুনঃনির্দেশ করেন। আমি আশা করি যে এটি উপলব্ধি করে। ধন্যবাদ!
নিক কোটেনবার্গ

3

আপনি একই বন্দরে 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
আমি যখন নোড 0.8 এ এটি চালাই, কেবলমাত্র সর্বশেষ সার্ভার যা .lten কল করে তার উত্তর বলে মনে হচ্ছে। এই ক্ষেত্রে, HTTP কাজ করে তবে HTTPS নয়। যদি আমি .ক্রিয়েট সার্ভারের ক্রমটিকে বিপরীত করি তবে HTTP কাজ করে তবে HTTPS নয়। :(
জো

1
এটি বর্ণিত হিসাবে কাজ করে না। জো দেখেছি বিষয়টি আমি নিশ্চিত করতে পারি।
স্টেপান মাজুরভ

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

এটি সঠিক হতে পারে তবে এটি কীভাবে প্রশ্নকারীর প্রশ্নের জবাব দেয় তা আপনাকে বিশদভাবে জানানো উচিত।
জো সি

1

আপনি 2 টি নোড.জেএস সার্ভার ইনস্ট্যান্ট করতে পারেন - এইচটিটিপি এবং এইচটিটিপিএসের জন্য একটি

আপনি একটি সেটআপ ফাংশনটিও সংজ্ঞায়িত করতে পারেন যা উভয় সার্ভারগুলি কার্যকর করবে, যাতে আপনাকে বেশি সদৃশ কোড লিখতে না হয়।

আমি এটি করার উপায়টি এখানে: (restify.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/

আমি এক্সপ্রেস 4.17.1 ব্যবহার করি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.