Je rencontre une erreur lorsque j'essaie de rediriger https://example.com vers https://www.example.com .
Lorsque je vais sur https://example.com , il ne redirige pas et renvoie le statut page / 200.
Je ne veux pas cela, je veux qu'il redirige vers https://www.example.com .
Lorsque je vais sur http://example.com , il redirige vers https://www.example.com
Quelqu'un peut-il me dire où je me trompe?
Voici mes fichiers de configuration par défaut et default-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.
la source
la source
Réponses:
Il vous manque une
listen
directive dans le fichierdefault-ssl.conf
. Ajouterlisten 443;
dans cette directivePar défaut, si vous omettez cette directive, nginx suppose que vous voulez écouter sur le port 80. Voici la documentation de ce comportement par défaut.
Edit: Merci pour le commentaire de @TeroKilkanen.
Voici la configuration complète de votre default-ssl.conf
Sidenote : Vous pouvez remplacer
ssl on;
directive parlisten 443 ssl;
comme recommandation de la documentation nginx .la source
ssl_certificate
etssl_certificate_key
directives dans ce bloc, et utiliserlisten 443 ssl;
pour qu'il soit un vhost SSL.default-ssl.conf
. Peut-être qu'un problème de faute de frappe ou de commande a causé cela.Ajoutez simplement une instruction if et vous devriez être en route. J'ai vérifié les résultats dans curl.exe -I et tous les cas en dehors de https://www.example.com sont traités comme 301. SSL est délicat car il est vérifié avant d'obtenir la redirection d'URL 301. Par conséquent, vous obtenez des erreurs de certificat.
Personnellement, j'aime supprimer les www du domaine mais j'ai écrit mon code ci-dessous pour répondre à votre question.
la source
La façon dont je le fais est d'utiliser une instruction if à l'intérieur du bloc serveur SSL qui redirige vers https de www
Bien sûr, chaque fois que vous souhaitez utiliser une instruction if dans un fichier de configuration nginx; vous devriez avoir lu: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
la source
if ($host = 'www.example.com')
n'est pas nécessaire.C'est 2018 maintenant et j'ai pensé donner à celui-ci un coup de feu renouvelé au cas où quelqu'un chercherait une solution simple.
Mon point de vue en tant que nouveau venu est de rendre les choses aussi simples que possible. Fondamentalement, vous souhaitez rediriger à la fois http://example.com et https://example.com vers https : // www .example.com. Et que vous ne réussissez qu'à rediriger http://example.com
C'est une opération assez simple ne nécessitant que deux blocs serveur (je vais le démontrer brièvement dans un seul fichier de configuration)
Maintenant, http://example.com et https://example.com doivent rediriger vers https://www.example.com . Fondamentalement, cette configuration redirige tout ce qui n'est pas www et / ou non https vers https: // www .
la source
Pour rediriger toutes les demandes vers
https://www.example
créer un bloc serveur pour la redirection et le domaine principal sur votre port SSL (généralement 443) ainsi que le port http par défaut 80
enregistrer et suivre avec
sudo nginx -s reload
Cela redirigera
la source
;
dans le deuxième bloc serveur de la clause if. Ça devrait êtrereturn 301 https://www.example.com$request_uri;
http
sur443
?