Mam uruchomioną aplikację na heroku z ekspresem na węźle z https ,. Jak zidentyfikować protokół wymuszający przekierowanie na https z nodejs na heroku?
Moja aplikacja to zwykły serwer http, nie zdaje sobie (jeszcze) że Heroku wysyła do niej żądania 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() })
Odpowiedzi:
Na dzień dzisiejszy, 10 października 2014 r. , Przy użyciu stosu Heroku Cedar i ExpressJS ~ 3.4.4 , mamy działający zestaw kodu.
Najważniejszą rzeczą do zapamiętania jest to, że wdrażamy się do Heroku. Zakończenie SSL następuje w module równoważenia obciążenia, zanim zaszyfrowany ruch dotrze do aplikacji węzła. Możliwe jest sprawdzenie, czy do wysłania żądania został użyty protokół https za pomocą req.headers ['x-forwarded-proto'] === 'https' .
Nie musimy martwić się posiadaniem lokalnych certyfikatów SSL w aplikacji itp., Jak w przypadku hostingu w innych środowiskach. Jednak jeśli używasz własnego certyfikatu, subdomen itp., Powinieneś najpierw uzyskać dodatek SSL zastosowany za pośrednictwem dodatków Heroku.
Następnie po prostu dodaj poniższe, aby wykonać przekierowanie z czegokolwiek innego niż HTTPS do HTTPS. Jest to bardzo zbliżone do zaakceptowanej odpowiedzi powyżej, ale:
Kod:
Uwaga dla użytkowników SailsJS (0.10.x). Możesz po prostu utworzyć politykę (egzekwowanieSsl.js) wewnątrz interfejsu API / polityk:
Następnie odwołaj się do pliku config / policies.js wraz z innymi zasadami, np .:
źródło
res.redirect
domyślnie jest to przekierowanie 302 (przynajmniej w express 4.x). Ze względów SEO i buforowania prawdopodobnie zamiast tego potrzebujesz przekierowania 301. Zamień odpowiednią linię nareturn res.redirect(301, ['https://', req.get('Host'), req.url].join(''));
Express 4.x
, usuńapp.configure
linię i po prostu użyj wewnętrznej mikstury.app.configure
jest starszym kodem i nie jest już uwzględniony w usłudze ExpressOdpowiedzią jest użycie nagłówka „x-forwarded-proto”, który Heroku przekazuje dalej, ponieważ jest to proxy thingamabob. (uwaga na marginesie: przekazują również kilka innych zmiennych x, które mogą być przydatne, sprawdź je ).
Mój kod:
Dzięki Brandon, właśnie czekałem na to 6-godzinne opóźnienie, które nie pozwoliło mi odpowiedzieć na moje własne pytanie.
źródło
GET
przez?&& process.env.NODE_ENV === "production"
do swojego warunku warunkowego, jeśli chcesz, aby działał tylko w środowisku produkcyjnym.Zaakceptowana odpowiedź zawiera zakodowaną na stałe domenę, co nie jest zbyt dobre, jeśli masz ten sam kod w kilku domenach (np .: dev-yourapp.com, test-yourapp.com, yourapp.com).
Użyj tego zamiast tego:
https://blog.mako.ai/2016/03/30/redirect-http-to-https-on-heroku-and-node-generally/
źródło
req.hostname
zreq.headers.host
wersji może wyraźnej Jestem w 4.2Napisałem mały moduł węzłowy, który wymusza SSL w projektach ekspresowych. Działa zarówno w standardowych sytuacjach, jak iw przypadku odwrotnych proxy (Heroku, nodejitsu itp.)
https://github.com/florianheinemann/express-sslify
źródło
Jeśli chcesz przetestować
x-forwarded-proto
nagłówek na swoim hoście lokalnym, możesz użyć nginx do skonfigurowania pliku vhost, który przekazuje wszystkie żądania do aplikacji węzła. Twój plik konfiguracyjny vhost nginx może wyglądać takNginX
Ważne jest tutaj to, że przekazujesz wszystkie żądania do portu localhost 3000 (to jest miejsce, w którym działa twoja aplikacja węzła) i konfigurujesz kilka nagłówków, w tym
X-Forwarded-Proto
Następnie w aplikacji wykryj ten nagłówek jak zwykle
Wyrazić
Koa
Zastępy niebieskie
Na koniec musisz dodać tę linię do swojego
hosts
plikuźródło
Powinieneś przyjrzeć się przekierowaniu heroku-ssl- . To działa jak urok!
źródło
Jeśli używasz cloudflare.com jako CDN w połączeniu z heroku, możesz łatwo włączyć automatyczne przekierowanie ssl w cloudflare w następujący sposób:
Zaloguj się i przejdź do swojego panelu
Wybierz Reguły strony
źródło
Użytkownicy Loopback mogą używać nieco dostosowanej wersji odpowiedzi arcseldon jako oprogramowania pośredniego:
serwer / oprogramowanie pośredniczące / forcessl.js
server / server.js
źródło
Jest to bardziej wyraźny sposób, aby to zrobić.
źródło
źródło
Dzięki app.use i dynamicznemu adresowi URL. Dla mnie działa zarówno lokalnie, jak i na Heroku
źródło
Sprawdzanie protokołu w nagłówku X-Forwarded-Proto działa dobrze na Heroku, tak jak wskazał Derek. Na co warto, tu jest sedno z middleware wyrazić, że używam i jego odpowiedniego testu.
źródło