Https এসএসএলে হিরোকু নোডজেএস HTTP পুনর্নির্দেশের বাধ্য করেছে


105

আমার একটি অ্যাপ্লিকেশন রয়েছে এবং https এর সাথে নোডে এক্সপ্রেস সহ হিরকুতে চলছে ,. হিরকুতে নোডেজ সহ https এ পুনঃনির্দেশ করার জন্য প্রোটোকলকে কীভাবে চিহ্নিত করব?

আমার অ্যাপ্লিকেশনটি কেবল একটি সাধারণ HTTP সার্ভার, এটি (এখনও) বুঝতে পারে না যে হিরকু এটি https অনুরোধগুলি পাঠাচ্ছে:

/* Heroku provides the port they want you on in this environment variable (hint: it's not 80) */
app.listen(process.env.PORT || 3000);

6
হিরোকু সমর্থন আমার উপরের প্রশ্নের উত্তর দিয়েছে, এবং এটি ইতিমধ্যে এখানে পোস্ট করা খুঁজে পাইনি, তাই আমি ভেবেছিলাম যে আমি এটি প্রকাশ্যে পোস্ট করব এবং জ্ঞানটি ভাগ করব। তারা অনুরোধ শিরোনামকে একটি 'x-' দিয়ে উপরিযুক্ত করে মূল অনুরোধ সম্পর্কে প্রচুর তথ্য দেয়। আমি এখন যে কোডটি ব্যবহার করছি তা এখানে রয়েছে (আমার রুটের সংজ্ঞাগুলির শীর্ষে):app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })
ডেরেক ব্রেডেনস্টেইনার

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

@ মুহাম্মাদ উমর, আপনার যুক্তি এখানে পয়েন্টে মনে হচ্ছে, আপনি কি আরও কিছু আবিষ্কার করেছেন?
করাহ

আমি কেবল ক্লাউডফ্লেয়ারকে নেমসারভার হিসাবে ব্যবহার করেছি যা এনজিএনএক্স হিসাবে কাজ করে এবং টগল বোতামটি ক্লিক করে আমাকে এসএসএল সংস্করণে পুনর্নির্দেশ করতে দেয়। এছাড়াও আপনি এটি করতে পারেন: বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / এইচটিটিপি / হায়ার্ডস / Furthermore তদ্ব্যতীত, সাধারণত কেউ সরাসরি ফর্মের উপরে অবতরণ করেন এবং তারপরে জমা দেন data সুতরাং সার্ভার সাইড কোড, ডিএনএস সার্ভার, এইচটিপি শিরোনাম, জাভাস্ক্রিপ্ট আপনি https বিকাশকারী.মোজিলা.আর.ইন.ইউএস
মুহাম্মদ উমার

উত্তর:


107

আজকের হিসাবে, 10 ই অক্টোবর 2014 , হেরোকু সিডার স্ট্যাক এবং এক্সপ্রেসজেএস ~ 3.4.4 ব্যবহার করে এখানে কোডের একটি কার্যকারী সেট রয়েছে।

এখানে মনে রাখার মূল বিষয়টি হ'ল আমরা হেরোকুতে নিযুক্ত করছি। এনক্রিপ্ট হওয়া ট্র্যাফিক আপনার নোড অ্যাপে পৌঁছানোর আগে লোড ব্যালেন্সারে এসএসএল সমাপ্তি ঘটে। রেক.হেডারদের ['এক্স-ফরওয়ার্ড-প্রোটো'] === 'https' দিয়ে অনুরোধ করার জন্য https ব্যবহার করা হয়েছিল কিনা তা পরীক্ষা করা সম্ভব ।

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

তারপরে এইচটিটিপিএস ব্যতীত অন্য যে কোনও কিছু থেকে এইচটিটিপিএসে পুনঃনির্দেশ করার জন্য কেবল নিম্নলিখিতটি যুক্ত করুন। এটি উপরে গৃহীত উত্তরের খুব কাছাকাছি, তবে:

  1. নিশ্চিত করে যে আপনি "অ্যাপ.ইউজ" ব্যবহার করেছেন (সমস্ত ক্রয়ের জন্য, কেবল পান না)
  2. স্পষ্টভাবে ফোর্স এসএসএল যুক্তিকে একটি ঘোষিত ফাংশনে বহিরাগত করে
  3. "অ্যাপ" ব্যবহার করে '*' ব্যবহার করবেন না - এটি পরীক্ষার সময় এটি ব্যর্থ হয়েছিল।
  4. এখানে, আমি কেবল প্রযোজনায় এসএসএল চাই। (আপনার প্রয়োজন অনুসারে পরিবর্তন করুন)

কোড:

 var express = require('express'),
   env = process.env.NODE_ENV || 'development';

 var forceSsl = function (req, res, next) {
    if (req.headers['x-forwarded-proto'] !== 'https') {
        return res.redirect(['https://', req.get('Host'), req.url].join(''));
    }
    return next();
 };

 app.configure(function () {

    if (env === 'production') {
        app.use(forceSsl);
    }

    // other configurations etc for express go here...
}

সেলসজেএস (0.10.x) ব্যবহারকারীদের জন্য নোট। আপনি এপিআই / নীতিগুলির অভ্যন্তরে কেবল একটি নীতি (প্রয়োগকারী এসএসএল.জেএস) তৈরি করতে পারেন:

module.exports = function (req, res, next) {
  'use strict';
  if ((req.headers['x-forwarded-proto'] !== 'https') && (process.env.NODE_ENV === 'production')) {
    return res.redirect([
      'https://',
      req.get('Host'),
      req.url
    ].join(''));
  } else {
    next();
  }
};

তারপরে কনফিগারেশন / পলিসি.জেএস এর সাথে অন্য কোনও নীতি যেমন উল্লেখ করুন:

'*': ['প্রমাণীকৃত', 'প্রয়োগ এসএসএল']


1
পাল নীতি ব্যবহার সম্পর্কে একটি নোট: সেলসজেস.আর.এস / # / ডকুমেন্টেশন / কনসেপ্টস / পলিসিতে যেমন বলা হয়েছে : "ডিফল্ট নীতি ম্যাপিংগুলি" ক্যাসকেড "বা" ট্রিকল ডাউন "হয় না" নিয়ামকের ক্রিয়াকলাপের জন্য নির্দিষ্ট ম্যাপিংগুলি ডিফল্ট ম্যাপিংকে ওভাররাইড করে। " এর অর্থ হ'ল নির্দিষ্ট কন্ট্রোলার / ক্রিয়াকলাপের জন্য আপনার অন্যান্য নীতিমালা হওয়ার সাথে সাথে আপনাকে সেই নিয়ামক / ক্রিয়াকলাপে 'ImportSsl' যুক্ত করা নিশ্চিত করতে হবে।
ম্যানুয়েল দারভেউ

2
"নিম্নলিখিত টেবিলটি এক্সপ্রেস 4-এ অন্য ছোট তবে গুরুত্বপূর্ণ পরিবর্তনগুলি তালিকাভুক্ত করেছে: ... অ্যাপ্লিকেশন কনফিগার () ফাংশনটি সরিয়ে ফেলা হয়েছে। সেই অনুযায়ী অ্যাপ্লিকেশনটি কনফিগার করুন ""
কেভিন হুইলার

9
এছাড়াও, নোট করুন যে res.redirectএটি 302 টি পুনর্নির্দেশের (কমপক্ষে 4.4 এক্সপ্রেসে) ডিফল্ট। এসইও এবং ক্যাশিংয়ের কারণে আপনি সম্ভবত 301 টি পুনর্নির্দেশ চান। এর সাথে সংশ্লিষ্ট লাইনটি প্রতিস্থাপন করুনreturn res.redirect(301, ['https://', req.get('Host'), req.url].join(''));
কেভিন হুইলার

6
দ্রষ্টব্য: ইন Express 4.x, app.configureলাইনটি সরিয়ে ফেলুন এবং কেবলমাত্র অভ্যন্তরীণ ঘাটতিটি ব্যবহার করুন। app.configureলিগ্যাসি কোড এবং এক্সপ্রেসে আর অন্তর্ভুক্ত নয়।
অগি গার্ডনার

96

উত্তরটি হ'ল 'এক্স-ফরোয়ার্ড-প্রোটো' শিরোনামটি ব্যবহার করা যা হেরোকু যেমন প্রক্সি আইটেমবব হিসাবে তা এগিয়ে যায়। (পার্শ্ব নোট: তারা বেশ কয়েকটি এক্স-ভেরিয়েবলগুলি খুব সহজেই কার্যকর হতে পারে, তাদের পরীক্ষা করে দেখুন )।

আমার কোড:

/* At the top, with other redirect methods before other routes */
app.get('*',function(req,res,next){
  if(req.headers['x-forwarded-proto']!='https')
    res.redirect('https://mypreferreddomain.com'+req.url)
  else
    next() /* Continue to other routes if we're not redirecting */
})

থ্যাঙ্কস ব্র্যান্ডন, কেবলমাত্র 6 ঘন্টা বিলম্বিত জিনিসের জন্য অপেক্ষা করছিল যা আমাকে নিজের প্রশ্নের উত্তর দিতে দেয় না।


4
এটি কি অন্য পদ্ধতিগুলি না GETকরে দেবে?
জেড শ্মিট

1
@ অ্যারন: আচ্ছা, আপনি যদি কোনও পোস্ট-অনুরোধ স্বচ্ছভাবে পুনর্নির্দেশ করেন তবে আপনি সম্ভাব্য তথ্য হারাবেন। আমার মনে হয় HTTP- র জন্য GET ব্যতীত অন্য অনুরোধে আপনার 400 টি ফিরিয়ে দেওয়া উচিত।
থিওডরটন

3
আপনি && process.env.NODE_ENV === "production"যদি এটি কেবল আপনার উত্পাদন পরিবেশে কাজ করতে চান তবে আপনি আপনার শর্তাধীন অবস্থায় ফেলে দিতে পারেন।
কিপিট্রিয়াল

307 (একই পদ্ধতিতে পুনর্নির্দেশ) সম্ভবত 400 ত্রুটির চেয়ে ভাল।
বেনি চেরনিয়াভস্কি-পাসকিন

এই উত্তরের সাথে একাধিক সমস্যা রয়েছে, নীচের পরবর্তী উত্তরটি দেখুন ( stackoverflow.com/a/23894573/14193 ) এবং এটিকে নীচে রেট দিন।
নিল

22

স্বীকৃত উত্তরেরটিতে একটি হার্ডকোডযুক্ত ডোমেন রয়েছে, যা বেশ কয়েকটি ডোমেইনে আপনার একই কোড থাকলে (যেমন: দেব- ইয়ুরাপ ডটকম, টেস্ট- ইয়ুরাপ ডটকম, ইউরাপ.কম) খুব ভাল নয়।

পরিবর্তে এটি ব্যবহার করুন:

/* Redirect http to https */
app.get('*', function(req,res,next) {
  if(req.headers['x-forwarded-proto'] != 'https' && process.env.NODE_ENV === 'production')
    res.redirect('https://'+req.hostname+req.url)
  else
    next() /* Continue to other routes if we're not redirecting */
});

https://blog.mako.ai/2016/03/30/redirect-http-to-https-on-heroku-and-node-generally/


সুন্দর কাজ করে আমি ডুনো কেন আমাকে মাত্র ৪.২req.hostnamereq.headers.host
জেরেমি পিডনোয়েল

16

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

https://github.com/florianheinemann/express-sslify


6

আপনি যদি x-forwarded-protoনিজের লোকালহোস্টের শিরোনামটি পরীক্ষা করতে চান তবে আপনি কোনও ভিস্ট ফাইল সেটআপ করতে nginx ব্যবহার করতে পারেন যা আপনার নোড অ্যাপ্লিকেশনটির সমস্ত অনুরোধকে প্রক্স করে। আপনার nginx vhost কনফিগারেশন ফাইলটি দেখতে দেখতে এমন হতে পারে

nginx

server {
  listen 80;
  listen 443;

  server_name dummy.com;

  ssl on;
  ssl_certificate     /absolute/path/to/public.pem;
  ssl_certificate_key /absolute/path/to/private.pem;

  access_log /var/log/nginx/dummy-access.log;
  error_log /var/log/nginx/dummy-error.log debug;

  # node
  location / {
    proxy_pass http://127.0.0.1:3000/;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

এখানে গুরুত্বপূর্ণ বিটগুলি হ'ল আপনি লোকালহোস্ট পোর্ট 3000 এ সমস্ত অনুরোধের প্রক্সিং করছেন (এটিই আপনার নোড অ্যাপ্লিকেশনটি চলছে) এবং আপনি সহ কয়েকটি শিরোনাম সেটআপ করছেন are X-Forwarded-Proto

তারপরে আপনার অ্যাপে যথারীতি সেই শিরোনামটি সনাক্ত করুন

প্রকাশ করা

var app = express()
  .use(function (req, res, next) {
    if (req.header('x-forwarded-proto') == 'http') {
      res.redirect(301, 'https://' + 'dummy.com' + req.url)
      return
    }
    next()
  })

Koa

var app = koa()
app.use(function* (next) {
  if (this.request.headers['x-forwarded-proto'] == 'http') {
    this.response.redirect('https://' + 'dummy.com' + this.request.url)
    return
  }
  yield next
})

হোস্ট

অবশেষে আপনাকে এই hostsফাইলটি আপনার ফাইলে যুক্ত করতে হবে

127.0.0.1 dummy.com

6

আপনার হিরাকু-এসএসএল-পুনর্নির্দেশের দিকে নজর দেওয়া উচিত । এটি যাদুমন্ত্রের মত কাজ করে!

var sslRedirect = require('heroku-ssl-redirect');
var express = require('express');
var app = express();

// enable ssl redirect
app.use(sslRedirect());

app.get('/', function(req, res){
  res.send('hello world');
});

app.listen(3000);

4

আপনি যদি হিরকুর সাথে মিলিয়ে ক্লাউডফ্লেয়ার ডটকমকে সিডিএন হিসাবে ব্যবহার করছেন, তবে আপনি সহজেই ক্লাউডফ্লেয়ারের মধ্যে স্বয়ংক্রিয় এসএসএল পুনঃনির্দেশ সক্ষম করতে পারবেন:

  1. লগইন করুন এবং আপনার ড্যাশবোর্ডে যান

  2. পৃষ্ঠা বিধি নির্বাচন করুন

    পৃষ্ঠা বিধি নির্বাচন করুন

  3. আপনার ডোমেন যুক্ত করুন, উদাহরণস্বরূপ www.example.com এবং স্যুইচ করুন সর্বদা https অন করতে সর্বদা https টি চালু রাখুন use

3

লুপব্যাক ব্যবহারকারীরা মিডসওয়্যার হিসাবে আরসেল্ডন উত্তরের কিছুটা অভিযোজিত সংস্করণ ব্যবহার করতে পারেন:

সার্ভার / মিডলওয়্যার / forcessl.js

module.exports = function() {  
  return function forceSSL(req, res, next) {
    var FORCE_HTTPS = process.env.FORCE_HTTPS || false;
      if (req.headers['x-forwarded-proto'] !== 'https' && FORCE_HTTPS) {
        return res.redirect(['https://', req.get('Host'), req.url].join(''));
      }
      next();
    };
 };

সার্ভার / server.js

var forceSSL = require('./middleware/forcessl.js');
app.use(forceSSL());

2

এটি করার জন্য এটি একটি আরও এক্সপ্রেস নির্দিষ্ট উপায়।

app.enable('trust proxy');
app.use('*', (req, res, next) => {
  if (req.secure) {
    return next();
  }
  res.redirect(`https://${req.hostname}${req.url}`);
});

0
app.all('*',function(req,res,next){
  if(req.headers['x-forwarded-proto']!='https') {
    res.redirect(`https://${req.get('host')}`+req.url);
  } else {
    next(); /* Continue to other routes if we're not redirecting */
  }
});

0

App.use এবং গতিশীল url সহ। আমার জন্য স্থানীয় এবং হেরোকুতে উভয়ই কাজ করে

app.use(function (req, res, next) {
  if (req.header('x-forwarded-proto') === 'http') {
    res.redirect(301, 'https://' + req.hostname + req.url);
    return
  }
  next()
});

-1

এক্স-ফরওয়ার্ড-প্রোটো শিরোনামে প্রোটোকলটি পরীক্ষা করা হেরোকুতে ঠিক কাজ করে, ঠিক যেমন ডেরেক নির্দেশ করেছেন। এটি মূল্যবান কিসের জন্য, এখানে আমি ব্যবহার করি এমন এক্সপ্রেস মিডলওয়্যারের একটি সংক্ষিপ্তসার এবং তার সম্পর্কিত পরীক্ষা।

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