Saya memiliki aplikasi yang aktif dan berjalan di heroku dengan express on node dengan https ,. Bagaimana cara mengidentifikasi protokol untuk memaksa pengalihan ke https dengan nodejs di heroku?
Aplikasi saya hanyalah server http sederhana, ia (belum) menyadari bahwa heroku mengirimkannya permintaan https:
/* Heroku provides the port they want you on in this environment variable (hint: it's not 80) */
app.listen(process.env.PORT || 3000);
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })
Jawaban:
Mulai hari ini, 10 Oktober 2014 , menggunakan tumpukan Heroku Cedar , dan ExpressJS ~ 3.4.4 , berikut adalah satu set kode yang berfungsi.
Hal utama yang perlu diingat di sini adalah bahwa kami SUDAH menerapkan ke Heroku. Penghentian SSL terjadi di penyeimbang beban, sebelum lalu lintas terenkripsi mencapai aplikasi node Anda. Anda dapat menguji apakah https digunakan untuk membuat permintaan dengan req.headers ['x-forwarded-proto'] === 'https' .
Kami tidak perlu khawatir dengan memiliki sertifikat SSL lokal di dalam aplikasi dll seperti yang mungkin Anda lakukan jika menghosting di lingkungan lain. Namun, Anda harus mendapatkan Add-On SSL yang diterapkan melalui Add-on Heroku terlebih dahulu jika menggunakan sertifikat, sub-domain Anda sendiri, dll.
Kemudian tambahkan yang berikut ini untuk melakukan pengalihan dari selain HTTPS ke HTTPS. Ini sangat dekat dengan jawaban yang diterima di atas, tetapi:
Kode:
Catatan untuk pengguna SailsJS (0.10.x). Anda cukup membuat kebijakan (menegakkanSsl.js) di dalam api / kebijakan:
Kemudian referensi dari config / policy.js bersama dengan kebijakan lainnya, misalnya:
sumber
res.redirect
default ini adalah pengalihan 302 (setidaknya dalam ekspres 4.x). Untuk alasan SEO dan cache, Anda mungkin menginginkan pengalihan 301. Ganti baris yang sesuai denganreturn res.redirect(301, ['https://', req.get('Host'), req.url].join(''));
Express 4.x
, hapusapp.configure
garis dan cukup gunakan ramuan bagian dalam.app.configure
adalah kode warisan dan tidak lagi disertakan dalam ekspres.Jawabannya adalah dengan menggunakan tajuk 'x-forwarded-proto' yang diteruskan Heroku seperti halnya proxy thingamabob. (catatan tambahan: Mereka melewatkan beberapa variabel x lain juga yang mungkin berguna, periksalah ).
Kode saya:
Terima kasih Brandon, hanya menunggu penundaan 6 jam yang tidak akan membiarkan saya menjawab pertanyaan saya sendiri.
sumber
GET
melalui?&& process.env.NODE_ENV === "production"
persyaratan jika Anda hanya ingin itu berfungsi di lingkungan produksi Anda.Jawaban yang diterima memiliki domain hardcode di dalamnya, yang tidak terlalu bagus jika Anda memiliki kode yang sama di beberapa domain (misalnya: dev-yourapp.com, test-yourapp.com, yourapp.com).
Gunakan ini sebagai gantinya:
https://blog.mako.ai/2016/03/30/redirect-http-to-https-on-heroku-and-node-generally/
sumber
req.hostname
denganreq.headers.host
mungkin versi ekspres. Saya di 4.2Saya telah menulis modul node kecil yang memberlakukan SSL pada proyek ekspres. Ini berfungsi baik dalam situasi standar dan dalam kasus proxy terbalik (Heroku, nodejitsu, dll.)
https://github.com/florianheinemann/express-sslify
sumber
Jika Anda ingin menguji
x-forwarded-proto
header di localhost Anda, Anda dapat menggunakan nginx untuk menyiapkan file vhost yang memproksikan semua permintaan ke aplikasi node Anda. File konfigurasi nginx vhost Anda mungkin terlihat seperti iniNginX
Bit penting di sini adalah Anda mem-proxy semua permintaan ke localhost port 3000 (ini adalah tempat aplikasi node Anda berjalan) dan Anda menyiapkan banyak header termasuk
X-Forwarded-Proto
Kemudian di aplikasi Anda, deteksi header itu seperti biasa
Mengekspresikan
Koa
Tuan rumah
Akhirnya Anda harus menambahkan baris ini ke
hosts
file Andasumber
Anda harus melihat heroku-ssl-redirect . Ini bekerja seperti pesona!
sumber
Jika Anda menggunakan cloudflare.com sebagai CDN dalam kombinasi dengan heroku, Anda dapat mengaktifkan pengalihan ssl otomatis dalam cloudflare dengan mudah seperti ini:
Masuk dan pergi ke dasbor Anda
Pilih Aturan Halaman
sumber
Pengguna loopback dapat menggunakan versi jawaban arcseldon yang sedikit diadaptasi sebagai middleware:
server / middleware / forcessl.js
server / server.js
sumber
Ini adalah cara yang lebih spesifik Express untuk melakukan ini.
sumber
sumber
Dengan app.use dan url dinamis. Bekerja baik secara lokal maupun di Heroku untuk saya
sumber
Memeriksa protokol di header X-Forwarded-Proto berfungsi dengan baik di Heroku, seperti yang ditunjukkan Derek. Untuk mengetahui manfaatnya, berikut adalah inti dari middleware Express yang saya gunakan dan pengujian yang sesuai.
sumber