Używam nginx w chmurze Rackspace po samouczku i po przeszukaniu sieci i jak dotąd nie mogę tego posortować.
Chcę, aby www.mysite.com przechodziła do mysite.com jak zwykle w .htaccess z SEO i innych powodów.
Mój /etc/nginx/sites-available/www.example.com.vhost config:
server {
listen 80;
server_name www.example.com example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
Próbowałem też
server {
listen 80;
server_name example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
Też próbowałem. Obie drugie próby powodują błędy pętli przekierowania.
if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}
Mój DNS jest skonfigurowany standardowo:
site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds
(przykładowe adresy IP i foldery zostały użyte jako przykłady i aby pomóc ludziom w przyszłości). Używam Ubuntu 11.
Dashboard > Settings > General Settings
i upewnij się, że nie ma żadnychwww
adresów URL adresu / adresu strony WordPress. Bez względu na to, jak skonfigurujesz swój nginx, jeśli masz www w tych adresach URL, zostanie przekierowane do tego z www w nim.Odpowiedzi:
Rozwiązanie HTTP
Z dokumentacji „właściwym sposobem jest zdefiniowanie osobnego serwera dla example.org”:
Rozwiązanie HTTPS
Dla tych, którzy chcą rozwiązania, w tym
https://
...Uwaga: pierwotnie nie
https://
zawarłem rozwiązania, ponieważ korzystamy z loadbalancerów, a nasz serwer https: // to serwer płatności SSL o dużym ruchu: nie mieszamy https: // i http: //.Aby sprawdzić wersję nginx, użyj
nginx -v
.Usuń www z adresu URL z przekierowaniem nginx
Musisz mieć DWIE kody serwerów.
Dodaj www do adresu URL za pomocą przekierowania nginx
Jeśli potrzebujesz czegoś przeciwnego, aby przekierować z domain.com na www.domain.com, możesz użyć tego:
Jak możesz sobie wyobrazić, jest odwrotnie i działa tak samo jak w pierwszym przykładzie. W ten sposób nie obniżysz znaków SEO, ponieważ jest to pełne przekierowanie perm i ruch. Brak stron WWW jest wymuszony, a katalog pokazany!
Niektóre z mojego kodu pokazano poniżej dla lepszego widoku:
źródło
return 301 $scheme://domain.com$request_uri;
. Nie ma potrzeby rejestrować żadnych wzorów, patrz pułapki NginxW rzeczywistości nie potrzebujesz nawet przepisywania.
Ponieważ moją odpowiedzią jest coraz więcej głosów, ale także powyższe. Nigdy nie należy używać
rewrite
w tym kontekście. Dlaczego? Ponieważ nginx musi przetworzyć i rozpocząć wyszukiwanie. Jeśli używaszreturn
(który powinien być dostępny w dowolnej wersji nginx), to bezpośrednio zatrzymuje wykonywanie. Jest to preferowane w dowolnym kontekście.Przekieruj zarówno non-SSL, jak i SSL na ich odpowiednik inny niż www:
$scheme
Zmienna będzie zawierać tylkohttp
jeśli serwer nasłuchuje tylko na porcie 80 (domyślnie) i opcji nie zawierają słuchaćssl
słowa kluczowego. Nieużywanie zmiennej nie przyniesie żadnej wydajności.Pamiętaj, że potrzebujesz więcej bloków serwerów, jeśli używasz HSTS, ponieważ nagłówki HSTS nie powinny być wysyłane przez niezaszyfrowane połączenia. Dlatego potrzebujesz niezaszyfrowanych bloków serwera z przekierowaniami i szyfrowanych bloków serwera z przekierowaniami i nagłówkami HSTS.
Przekieruj wszystko do SSL (konfiguracja osobista w UNIX z IPv4, IPv6, SPDY, ...):
Myślę, że możesz sobie teraz wyobrazić inne związki z tym wzorem.
Więcej moich konfiguracji? Idź tu i tutaj .
źródło
Możesz dowiedzieć się, że chcesz użyć tej samej konfiguracji dla większej liczby domen.
Poniższy fragment usuwa www przed dowolną domeną:
źródło
http
na$scheme
return ...
irewrite ... last
”. Jakieś zaktualizowane linki do problemów z wydajnością?Potrzebujesz dwóch bloków serwera.
Umieść je w pliku konfiguracyjnym, np
/etc/nginx/sites-available/sitename
Powiedzmy, że decydujesz się na http://example.com jako główny adres do użycia.
Twój plik konfiguracyjny powinien wyglądać następująco:
Pierwszy blok serwera będzie zawierał instrukcje przekierowywania wszelkich żądań z prefiksem „www”. Nasłuchuje żądań adresu URL z prefiksem „www” i przekierowuje.
Nie robi nic więcej.
Drugi blok serwera pomieści twój główny adres - adres URL, którego chcesz użyć. Wszystkie pozostałe ustawienia jak tu iść
root
,index
,location
, itd. Sprawdź plik domyślny dla innych ustawień, które można zawrzeć w bloku serwera.Serwer potrzebuje dwóch rekordów DNS A.
W przypadku ipv6 utwórz parę rekordów AAAA, używając swojego adresu-ipv6.
źródło
Oto jak to zrobić dla wielu nazw serwerów www do no-www (użyłem tego dla subdomen):
źródło
Najlepsza praktyka: osobno
server
w / hardcodedserver_name
Najlepszą praktyką w przypadku nginx jest użycie oddzielnego
server
dla takiego przekierowania (nieudostępnionego wserver
głównej konfiguracji), zakodowanie wszystkiego na sztywno i nie używanie wyrażeń regularnych.Konieczne może być również zakodowanie domen na stałe, jeśli używasz HTTPS, ponieważ musisz z góry wiedzieć, które certyfikaty będziesz zapewniał.
Używanie wyrażeń regularnych w obrębie
server_name
Jeśli masz wiele witryn i nie dbasz o najwyższą wydajność, ale chcesz, aby każda z nich miała takie same zasady dotyczące
www.
prefiksu, możesz użyć wyrażeń regularnych. Najlepsza praktyka korzystania z osobnegoserver
nadal będzie obowiązywać .Pamiętaj, że to rozwiązanie staje się trudne, jeśli używasz protokołu https, ponieważ musisz mieć jeden certyfikat na wszystkie nazwy domen, jeśli chcesz, aby działał poprawnie.
nie-
www
dowww
w / regex w dedykowanym pojedynczyserver
dla wszystkich stron:www
do non-www
w / regex w dedykowanym singluserver
dla wszystkich witryn:www
do non-www
w / regex w dedykowanym tylkoserver
dla niektórych witryn:Konieczne może być ograniczenie wyrażenia regularnego, aby obejmowało tylko kilka domen, wtedy możesz użyć czegoś takiego, aby dopasować
www.example.org
,www.example.com
iwww.subdomain.example.net
:Testowanie wyrażeń regularnych w / nginx
Możesz sprawdzić, czy wyrażenie regularne działa zgodnie z oczekiwaniami
pcretest
w twoim systemie, co jest dokładnie takie samopcre
biblioteką, której twój nginx będzie używał do wyrażeń regularnych:Zauważ, że nie musisz się martwić kropkami ani wielkością liter, ponieważ nginx już się tym zajmuje, tak jak w wyrażeniu regularnym nazwy serwera nginx, gdy nagłówek „Host” ma kropkę końcową .
Posyp
if
w istniejącymserver
/ HTTPS:To ostateczne rozwiązanie na ogół nie jest uważane za najlepszą praktykę, jednak nadal działa i działa.
W rzeczywistości, jeśli używasz HTTPS, to końcowe rozwiązanie może okazać się łatwiejsze w utrzymaniu, ponieważ nie musisz kopiować i wklejać całego zestawu dyrektyw ssl między różnymi
server
definicjami, a zamiast tego możesz umieścić fragmenty tylko w potrzebnych serwerów, co ułatwia debugowanie i zarządzanie witrynami.non-
www
towww
:www
do non-www
:zakodować na stałe jedną preferowaną domenę
Jeśli chcesz nieco większej wydajności, a także spójności między wieloma domenami, z których jedna
server
może korzystać, nadal może być sensowne jawne zakodowanie jednej preferowanej domeny:Bibliografia:
źródło
To rozwiązanie pochodzi z mojego osobistego doświadczenia. Użyliśmy kilku segmentów Amazon S3 i jednego serwera do przekierowywania
non-www
dowww
nazw domen w celu dopasowania do zasad nagłówka S3 „Host” .Użyłem następującej konfiguracji serwera nginx :
To pasuje do wszystkich nazw domen wskazanych na serwer, zaczynając od cokolwiek oprócz
www.
i przekierowuje dowww.<domain>
. W ten sam sposób możesz wykonać przekierowanie przeciwnewww
donon-www
.źródło
listen 80
musisz dodać,listen 443 ssl
a następniessl_certificate
issl_certificate_key
dyrektyw.listen 443 ssl
używany przewodnik w Google, który pokazał twój przykład tylko z dodaną linią z brakującym certyfikatem. To nie zadziała i spowoduje poważny ból głowy.Połączyłem najlepsze ze wszystkich prostych odpowiedzi, bez domen zakodowanych na stałe.
301 stałe przekierowanie z non-www na www (HTTP lub HTTPS):
Jeśli wolisz inne niż HTTPS, inne niż www niż HTTPS, przekierowuj www jednocześnie:
źródło
Przekieruj non-www na www
W przypadku pojedynczej domeny:
Dla wszystkich domen:
Przekieruj www na inną niż www dla pojedynczej domeny:
Dla wszystkich domen:
źródło
80
i443
?listen
dyrektyw (nginx 1.4.6).Spróbuj tego
Inna droga: Nginx no-www to www
i www do no-www
źródło
Unikalny format:
źródło
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
źródło
$scheme://www.domain.com$1
uniknąć podwójnego cięcianie jestem pewien, czy ktokolwiek zauważy, że zwrócenie 301 może być poprawne, ale przeglądarki się do tego dławią
jest szybszy niż:
źródło
Blog widmo
aby stworzyć zalecaną przez nginx metodę
return 301 $scheme://example.com$request_uri;
pracy z Ghostem, musisz dodać w głównym bloku serwera:źródło
Jeśli nie chcesz na stałe kodować nazwy domeny, możesz użyć tego bloku przekierowań. Domena bez wiodącego www jest zapisywana jako zmienna,
$domain
którą można ponownie wykorzystać w instrukcji przekierowania.ODNIESIENIE: Przekierowanie poddomeny z wyrażeniem regularnym w nginx
źródło
źródło
Jeśli masz problemy z uruchomieniem tej funkcji, może być konieczne dodanie adresu IP serwera. Na przykład:
gdzie XXX.XXX.XXX.XXX to adres IP (oczywiście).
Uwaga: aby poprawnie przekierować żądania https, należy zdefiniować ssl crt i lokalizację klucza
Nie zapomnij zrestartować nginx po dokonaniu zmian:
źródło
/etc/init.d/nginx reload
możeszreload
także serwer, który nie powoduje żadnych przestojów.