Saya sudah mencoba mengatur HTTPS dengan proyek node.js yang sedang saya kerjakan. Saya pada dasarnya mengikuti dokumentasi node.js untuk contoh ini:
// 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);
Sekarang, ketika saya melakukannya
curl -k https://localhost:8000/
saya mendapat
hello world
seperti yang diharapkan. Tetapi jika saya lakukan
curl -k http://localhost:8000/
saya mendapat
curl: (52) Empty reply from server
Dalam retrospeksi, ini tampak jelas bahwa itu akan bekerja seperti ini, tetapi pada saat yang sama, orang-orang yang akhirnya mengunjungi proyek saya tidak akan mengetikkan https : // yadayada, dan saya ingin semua lalu lintas menjadi https dari saat mereka mencapai situs
Bagaimana saya bisa mendapatkan node (dan Express karena itu adalah kerangka yang saya gunakan) untuk menyerahkan semua lalu lintas masuk ke https, terlepas dari apakah itu ditentukan atau tidak? Saya belum dapat menemukan dokumentasi yang membahas hal ini. Atau hanya diasumsikan bahwa dalam lingkungan produksi, simpul memiliki sesuatu yang duduk di depannya (misalnya nginx) yang menangani pengalihan semacam ini?
Ini adalah perampokan pertama saya ke pengembangan web, jadi tolong maafkan ketidaktahuan saya jika ini sesuatu yang jelas.
Jawaban:
Ryan, terima kasih telah mengarahkan saya ke arah yang benar. Saya menyempurnakan jawaban Anda (paragraf 2) sedikit dengan beberapa kode dan berfungsi. Dalam skenario ini cuplikan kode ini dimasukkan ke dalam aplikasi kilat saya:
Server https express mendengarkan ATM pada 3000. Saya mengatur aturan iptables ini sehingga simpul tidak harus dijalankan sebagai root:
Secara keseluruhan, ini bekerja persis seperti yang saya inginkan.
sumber
Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects
if(!req.secure){}
if(req.protocol==='http')
pernyataanJika Anda mengikuti port konvensional karena HTTP mencoba port 80 secara default dan HTTPS mencoba port 443 secara default, Anda dapat memiliki dua server pada mesin yang sama: Berikut kodenya:
Uji dengan https:
Dengan http:
Lebih detail: Nodejs HTTP dan HTTPS melalui port yang sama
sumber
res.writeHead(301, etc.)
hanya akan berfungsi dengan benar untuk panggilan GET, karena301
tidak memberi tahu klien untuk menggunakan metode yang sama. Jika Anda ingin agar metode yang digunakan (dan semua parameter lainnya) harus Anda gunakanres.writeHead(307, etc.)
. Dan jika itu masih tidak berhasil, Anda bisa melakukan proxy. Sumber: http://stackoverflow.com/a/17612942/1876359Terima kasih kepada orang ini: https://www.tonyerwin.com/2014/09/redirecting-http-to-https-with-nodejs.html
sumber
app.enable('trust proxy');
app.get('X-Forwarded-Proto') != 'http'
alih-alihreq.secure
aws.amazon.com/premiumsupport/knowledge-center/…Dengan Nginx Anda dapat memanfaatkan header "x-forwarded-proto":
sumber
app.enable('trust proxy');
: "Menunjukkan aplikasi berada di belakang proxy yang menghadap ke depan, dan menggunakan header X-Forwarded- * untuk menentukan koneksi dan alamat IP klien." expressjs.com/en/4x/api.html#app.setPada 0.4.12 kami tidak memiliki cara nyata untuk mendengarkan HTTP & HTTPS pada port yang sama menggunakan server HTTP / HTTPS Node.
Beberapa orang telah memecahkan masalah ini dengan memiliki server HTTPS Node (ini juga berfungsi dengan Express.js) mendengarkan 443 (atau port lain) dan juga memiliki server http kecil yang diikat ke 80 dan mengarahkan pengguna ke port aman.
Jika Anda benar-benar harus dapat menangani kedua protokol pada satu port maka Anda perlu meletakkan nginx, lighttpd, apache, atau beberapa server web lain pada port tersebut dan telah bertindak sebagai proxy terbalik untuk Node.
sumber
Anda dapat menggunakan modul express-force-https :
npm install --save express-force-https
sumber
app
terlebih dahulu. (lihat jawaban ini )Saya menggunakan solusi yang diusulkan oleh Basarat tapi saya juga perlu menimpa port karena saya dulu punya 2 port berbeda untuk protokol HTTP dan HTTPS.
Saya lebih suka juga menggunakan bukan port standar sehingga untuk memulai nodejs tanpa hak root. Saya suka 8080 dan 8443 karena saya berasal dari banyak tahun pemrograman pada kucing jantan.
File lengkap saya menjadi
Lalu saya menggunakan iptable untuk menulis 80 dan 443 lalu lintas pada port HTTP dan HTTPS saya.
sumber
Jawaban ini perlu diperbarui agar berfungsi dengan Express 4.0. Berikut adalah cara kerja server http terpisah:
sumber
Jika aplikasi Anda berada di belakang proxy tepercaya (mis. AWS ELB atau nginx yang dikonfigurasi dengan benar), kode ini akan berfungsi:
Catatan:
sumber
Saya menemukan req.protocol berfungsi ketika saya menggunakan express (belum diuji tanpa tetapi saya curiga berfungsi). menggunakan simpul saat ini 0.10.22 dengan express 3.4.3
sumber
Sebagian besar jawaban di sini menyarankan untuk menggunakan header req.headers.host.
Header Host diperlukan oleh HTTP 1.1, tetapi sebenarnya opsional karena header mungkin tidak benar-benar dikirim oleh klien HTTP, dan node / express akan menerima permintaan ini.
Anda mungkin bertanya: klien HTTP mana (mis: browser) yang dapat mengirim permintaan yang tidak memiliki tajuk itu? Protokol HTTP sangat sepele. Anda dapat membuat permintaan HTTP dalam beberapa baris kode, untuk tidak mengirim header host, dan jika setiap kali Anda menerima permintaan yang salah Anda melemparkan pengecualian, dan tergantung pada bagaimana Anda menangani pengecualian seperti itu, ini dapat menurunkan server Anda.
Jadi selalu validasikan semua input . Ini bukan paranoia, saya telah menerima permintaan yang kurang memiliki header host di layanan saya.
Juga, jangan pernah memperlakukan URL sebagai string . Gunakan modul url simpul untuk memodifikasi bagian-bagian tertentu dari string. Memperlakukan URL sebagai string dapat dieksploitasi dengan berbagai cara. Jangan lakukan itu.
sumber
Ini adalah apa yang kami gunakan dan ini sangat bagus!
sumber
Anda dapat menggunakan modul "net" untuk mendengarkan HTTP & HTTPS pada port yang sama
sumber
Ini bekerja untuk saya:
sumber
Anda dapat membuat instance 2 server Node.js - satu untuk HTTP dan HTTPS
Anda juga dapat menetapkan fungsi pengaturan yang akan dijalankan oleh kedua server, sehingga Anda tidak perlu menulis banyak kode duplikat.
Inilah cara saya melakukannya: (menggunakan restify.js, tetapi harus bekerja untuk express.js, atau simpul itu sendiri juga)
http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/
sumber
Ini bekerja untuk saya:
Rekomendasikan tambahkan header sebelum redirect ke https
Sekarang, ketika Anda melakukannya:
Anda mendapatkan:
Saya menggunakan express 4.17.1
sumber