Mam stronę rejestracji w subdomenie, takiej jak: https://signup.example.com
Powinien być dostępny tylko przez HTTPS, ale obawiam się, że ludzie mogą natknąć się na to przez HTTP i dostać 404.
Mój blok html / server w nginx wygląda następująco:
html {
server {
listen 443;
server_name signup.example.com;
ssl on;
ssl_certificate /path/to/my/cert;
ssl_certificate_key /path/to/my/key;
ssl_session_timeout 30m;
location / {
root /path/to/my/rails/app/public;
index index.html;
passenger_enabled on;
}
}
}
Co mogę dodać, aby osoby, które http://signup.example.com
zostaną przekierowane https://signup.example.com
? (Wiem, że istnieją wtyczki Rails, które mogą wymusić, SSL
ale miałem nadzieję tego uniknąć)
nginx
ssl
redirect
ruby-on-rails
Callmeed
źródło
źródło
Odpowiedzi:
Według pułapek nginx , nieco lepiej jest pominąć niepotrzebne przechwytywanie, używając
$request_uri
zamiast tego. W takim przypadku dodaj znak zapytania, aby nginx nie podwoił argumentów zapytania.źródło
return 301 http://domain.com$request_uri;
return 301...
powoduje błąd „zbyt wielu przekierowań”, podczas gdy metoda przepisywania faktycznie działa.return 301
działa, chyba że (chyba) uruchamiasz go również dla poprawnych adresów URL, nasłuchując na obu portach (przykład konfiguracji wyzwalającej problem: weź pierwszą odpowiedź serverfault.com/a/474345/29689 i pomiń if ).Najlepszym sposobem opisanym w oficjalnym poradniku jest zastosowanie
return
dyrektywy:źródło
301 Moved Permanently
(twoje linki zostały trwale przeniesione), a także ponownie piszeproxy_set_header X-Forwarded-Proto https;
listen 443;
w tym samym bloku?Jest to poprawny i najbardziej wydajny sposób, jeśli chcesz zachować wszystko w jednym bloku serwera:
Wszystko inne powyżej, używając „przepisz” lub „jeśli ssl_protocol” itp. Jest wolniejsze i gorsze.
Jest to to samo, ale jeszcze bardziej wydajne, ponieważ uruchamiając przepisywanie tylko w protokole http, unikasz konieczności sprawdzania zmiennej $ schemat przy każdym żądaniu. Ale tak na poważnie, to tak drobna rzecz, że nie trzeba ich rozdzielać.
źródło
Jeśli używasz nowej definicji podwójnego serwera HTTP i HTTPS, możesz użyć następujących opcji:
To wydaje się działać dla mnie i nie powoduje pętli przekierowań.
Edytować:
Zamieniono:
z linią przepisywania Pratik.
źródło
If you are using the new dual HTTP and HTTPS server definition
to powinieneś to rozdzielić.return 301 https://$server_name$request_uri;
ponieważ jest to preferowana metoda.Jeszcze inny wariant, który zachowuje nagłówek żądania Host: i podąża za przykładem „DOBRY” w pułapkach nginx :
Oto wyniki. Pamiętaj, że użycie
$server_name
zamiast$host
zawsze przekierowuje dohttps://site1
.źródło
Note that using $server_name instead of $host would always redirect to https://site1
czy nie po to$request_uri
jest?$request_uri
nie zawiera nazwy hosta ani domeny. Innymi słowy, zawsze zaczyna się od znaku „/”.Upewnij się, że ustawiłeś opcję „bezpieczne” dla plików cookie, w przeciwnym razie zostaną one wysłane na żądanie HTTP i mogą zostać przechwycone przez narzędzie takie jak Firesheep.
źródło
Myślę, że to działa lepiej. xxxx oznacza adres IP twojego serwera. Jeśli pracujesz z Plesk 12, możesz to zrobić, zmieniając plik „nginx.conf” w katalogu „/var/www/vhosts/system/domain.tld/conf” dla dowolnej domeny. Nie zapomnij zrestartować usługi nginx po zapisaniu konfiguracji.
źródło
rewrite ^ https://$host$request_uri? permanent;
byłoby lepszym rozwiązaniem, ponieważ możesz mieć kilka nazw serwerów naMyślę, że to najprostsze rozwiązanie. Wymusza ruch zarówno inny niż HTTPS, jak i inny niż WWW tylko dla HTTPS i www.
EDYCJA - kwi 2018: Rozwiązanie bez IF można znaleźć w moim poście tutaj: https://stackoverflow.com/a/36777526/6076984
źródło