J'ai une page d'inscription sur un sous-domaine tel que: https://signup.example.com
Il ne devrait être accessible que via HTTPS, mais je crains que les gens ne tombent dessus via HTTP et obtiennent un 404.
Mon bloc html / server dans nginx ressemble à ceci:
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;
}
}
}
Que puis-je ajouter pour que les personnes qui vont se http://signup.example.com
faire rediriger https://signup.example.com
? (Pour info je sais qu'il y a des plugins Rails qui peuvent forcer SSL
mais espéraient l'éviter)
nginx
ssl
redirect
ruby-on-rails
Callmeed
la source
la source
Réponses:
Selon les pièges de nginx , il est légèrement préférable d’omettre la capture inutile, de l’utiliser
$request_uri
plutôt. Dans ce cas, ajoutez un point d'interrogation pour empêcher nginx de doubler les arguments de la requête.la source
return 301 http://domain.com$request_uri;
return 301...
provoque l'erreur "Trop de redirections" alors que la méthode de réécriture fonctionne réellement.return 301
fonctionne, à moins que (je suppose) que vous le déclenchiez également pour les URL correctes, en écoutant sur les deux ports (exemple de configuration déclenchant le problème: prenez la première réponse de serverfault.com/a/474345/29689 et omettez le if. ).Le meilleur moyen décrit dans le guide officiel consiste à utiliser la
return
directive:la source
301 Moved Permanently
(vos liens ont été définitivement déplacés) ainsi qu'une ré-écritureproxy_set_header X-Forwarded-Proto https;
listen 443;
dans le même bloc?C'est le moyen le plus efficace et le plus efficace si vous souhaitez tout conserver dans un bloc de serveur:
Tout le reste ci-dessus, en utilisant "rewrite" ou "if ssl_protocol" etc. est plus lent et pire.
Voici la même chose, mais encore plus efficace, en ne lançant que la réécriture sur le protocole http, cela évite de vérifier la variable $ scheme à chaque requête. Mais sérieusement, c'est une chose tellement mineure qu'il n'est pas nécessaire de les séparer.
la source
Si vous utilisez la nouvelle définition de serveur double HTTP et HTTPS, vous pouvez utiliser les éléments suivants:
Cela semble fonctionner pour moi et ne provoque pas de boucles de redirection.
Modifier:
Remplacé:
avec la ligne de réécriture de Pratik.
la source
If you are using the new dual HTTP and HTTPS server definition
alors vous devriez le séparer.return 301 https://$server_name$request_uri;
la méthode recommandée.Encore une autre variante, qui préserve l’en-tête Host: request et suit l’exemple "GOOD" sur les pièges nginx :
Voici les résultats. Notez que l'utilisation
$server_name
au lieu de$host
serait toujours rediriger vershttps://site1
.la source
Note that using $server_name instead of $host would always redirect to https://site1
c'est pas pour ça$request_uri
?$request_uri
ne contient pas d'hôte ou de nom de domaine. En d'autres termes, il commence toujours par un caractère "/".Assurez-vous que les cookies sont sécurisés, sinon ils seront envoyés sur la requête HTTP et pourraient être saisis par un outil comme Firesheep.
la source
Cela fonctionne mieux je pense. xxxx fait référence à l'IP de votre serveur. Si vous travaillez avec Plesk 12, vous pouvez le faire en modifiant le fichier "nginx.conf" dans le répertoire "/var/www/vhosts/system/domain.tld/conf" pour le domaine de votre choix. N'oubliez pas de redémarrer le service nginx après avoir enregistré la configuration.
la source
rewrite ^ https://$host$request_uri? permanent;
serait une meilleure solution car vous pourriez avoir plusieurs noms de serveur sur un vhostJe pense que c'est la solution la plus simple. Force le trafic non HTTPS et non WWW vers HTTPS et www uniquement.
EDIT - avril 2018: La solution sans IF est disponible dans mon message ici: https://stackoverflow.com/a/36777526/6076984
la source