Wystąpił błąd podczas próby przekierowania https://example.com na https://www.example.com .
Kiedy przechodzę do https://example.com , nie przekierowuje i zwraca status strony / 200.
Nie chcę tego, chcę przekierować na https://www.example.com .
Kiedy wchodzę na http://example.com , przekierowuje na https://www.example.com
Czy ktoś może mi powiedzieć, gdzie popełniam błąd?
To są moje domyślne i domyślne pliki konfiguracyjne-ssl:
default.conf
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
default-ssl.conf
upstream app_server_ssl {
server unix:/tmp/unicorn.sock fail_timeout=0;
}
server {
server_name example.com;
return 301 https://www.example.com$request_uri
}
server {
server_name www.example.com;
listen 443;
root /home/app/myproject/current/public;
index index.html index.htm;
error_log /srv/www/example.com/logs/error.log info;
access_log /srv/www/example.com/logs/access.log combined;
ssl on;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /srv/www/example.com/keys/ssl.crt;
ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
ssl_ciphers AES128-SHA:RC4-MD5:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5:AES128-SHA;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;
try_files $uri/index.html $uri.html $uri @app;
# CVE-2013-2028 http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html
if ($http_transfer_encoding ~* chunked) {
return 444;
}
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server_ssl;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /home/app/example/current/public;
}
}
nginx
ssl
ssl-certificate
https
Thomas V.
źródło
źródło
Odpowiedzi:
Brakuje
listen
dyrektywy w plikudefault-ssl.conf
. Dodajlisten 443;
w tej dyrektywieDomyślnie, jeśli pominiesz tę dyrektywę, nginx zakłada, że chcesz nasłuchiwać na porcie 80. Tutaj dokumentacja tego domyślnego zachowania.
Edycja: Dzięki za komentarz od @TeroKilkanen.
Tutaj pełna konfiguracja dla pliku default-ssl.conf
Sidenote : Możesz zastąpić
ssl on;
dyrektywęlisten 443 ssl;
zaleceniem z dokumentacji nginx .źródło
ssl_certificate
i zarządzaćssl_certificate_key
w tym bloku i używać golisten 443 ssl;
tak, aby był vhostem SSL.default-ssl.conf
. Być może spowodował to jakiś błąd literowy lub zmiana kolejności.Po prostu wrzuć instrukcję if i powinieneś być w drodze. Sprawdziłem wyniki w curl.exe -I i wszystkie przypadki oprócz https://www.example.com są traktowane jako 301. SSL jest trudny, ponieważ jest sprawdzany przed uzyskaniem przekierowania 301 URL. W związku z tym pojawiają się błędy certyfikatu.
Osobiście lubię usuwać www z domeny, ale napisałem swój kod poniżej, aby odpowiedzieć na twoje pytanie.
źródło
Sposób, w jaki to robię, to użycie instrukcji if wewnątrz bloku serwera ssl, który przekierowuje na https www
Oczywiście, ilekroć chcesz użyć instrukcji if w pliku konfiguracyjnym nginx; powinieneś przeczytać: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
źródło
if ($host = 'www.example.com')
nie jest konieczny.Teraz jest 2018 i postanowiłem dać temu nowy strzał, na wypadek, gdyby ktoś szukał prostego rozwiązania.
Uważam to za stosunkowo nowe, aby maksymalnie uprościć sprawę. Zasadniczo chcesz przekierować zarówno http://example.com, jak i https://example.com na https : // www .example.com. I że przekierowujesz tylko http://example.com
Jest to dość prosta operacja, wymagająca tylko dwóch bloków serwera (zilustruję to krótko w jednym pliku konfiguracyjnym)
Teraz zarówno http://example.com, jak i https://example.com powinny przekierowywać na https://www.example.com . Zasadniczo ta konfiguracja przekierowuje wszystko inne niż www i / lub non-https na https: // www .
źródło
Aby przekierować wszystkie żądania do
https://www.example
utwórz blok serwera dla domeny przekierowującej i podstawowej na swoim porcie SSL (zazwyczaj 443), a także domyślnym porcie HTTP 80
zapisz i podążaj za
sudo nginx -s reload
To przekieruje
źródło
;
drugim bloku serwera brakuje klauzuli if. Powinno byćreturn 301 https://www.example.com$request_uri;
http
na443
?