Chcę utworzyć regułę w Nginx, która robi dwie rzeczy:
- Usuwa „www”. z URI żądania
- Przekierowuje do „https”, jeśli identyfikator URI żądania to „http”
Istnieje wiele przykładów, jak wykonać każdą z tych czynności osobno, ale nie mogę znaleźć rozwiązania, które działa poprawnie (tzn. Nie tworzy pętli przekierowania i poprawnie obsługuje wszystkie przypadki).
Musi obsłużyć wszystkie te przypadki:
1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path
Wszystko to powinno zakończyć się na https://example.com/path (# 4) bez zapętlania. Jakieś pomysły?
Odpowiedzi:
Najlepszym sposobem na osiągnięcie tego jest użycie trzech bloków serwera: jeden do przekierowania http na https, jeden do przekierowania nazwy www https na no-www i jeden do obsługi żądań. Powodem użycia dodatkowych bloków serwera zamiast ifs jest to, że wybór serwera jest dokonywany przy użyciu tabeli skrótów i jest bardzo szybki. Korzystanie z poziomu serwera if oznacza, że if jest uruchamiane dla każdego żądania, co jest marnotrawstwem. Również przechwytywanie żądanego identyfikatora URI w przepisywaniu jest marnotrawstwem, ponieważ nginx ma już tę informację w zmiennych $ uri i $ request_uri (odpowiednio bez i z ciągiem zapytania).
źródło
https://example.com/
www.sub.example.com
do,sub.example.com
a następnie uzyskać tylko certyfikat SSL.sub.example.com
Teraz wiem, że sprawdzanie certyfikatu ssl odbywa się przed przekierowaniem 301, więc nie może działać. Więcej wyjaśnień tutaj: serverfault.com/a/358625/144811To działa dla mnie:
Pamiętaj, że jedno
yourdomain.com
i drugiewww.yourdomain.com
musi znajdować się w certyfikacie SSL. Jest to możliwe w przypadku certyfikatu wieloznacznego lub alternatywnej nazwy serwera, jak wyjaśniono tutaj . Sprawdź https://www.startssl.com, aby znaleźć ładne i bezpłatne certyfikaty, które to robią. ( Edith : począwszy od wersji Chrome 56, certyfikaty Startsl nie będą już zaufane. Zamiast tego spróbuj https://letsencrypt.org/ ).źródło
include
reguły, aby dodać je do obu bloków serwera SSL.Po spędzeniu tak dużo czasu z setkami podobnych przypadków wymyśliłem następujący fragment kodu. Jest krótki i można go łatwo dostosować, aby pasował na wszystko.
Tak, może być. Ale istnieje z jakiegoś powodu i nie powinien wyrządzać szkody tym, którzy wiedzą, jak go właściwie używać. ;)
źródło
Wolę powrócić z kodem odpowiedzi, aby przeglądarka wiedziała, że przekierowujesz go na inny adres URL.
następnie inny blok konfiguracji serwera dla
https
źródło
co powiesz na utworzenie bloku serwera w tym celu:
następnie ponownie uruchamiam nginx
źródło
https://www.example.com
dohttps://example.com
.Myślę, że to powinno zadziałać.
W zwykłej definicji serwera HTTP sugerowano coś takiego jak anthonysomerset, to znaczy:
Następnie w definicji serwera SSL:
W ten sposób przekierowanie powinno nastąpić tylko raz na żądanie, bez względu na adres URL użytkownika, do którego pierwotnie się udaje.
źródło
if ($host = 'www.example.com') {
ponieważ regex nie działał dla mnie. Nie mam pojęcia dlaczego, ponieważ wygląda poprawnie.Oto pełny przykład, który skończył się dla mnie. Problem polegał na tym, że nie miałem szczegółów ssl (
ssl_certificate
itp.) W bloku przekierowań www. Pamiętaj, aby sprawdzić swoje dzienniki (sudo tail -f /var/log/nginx/error.log
)!źródło