2017-03-19 2 views
1

Je veux empêcher les gens d'utiliser mon site via http et les forcer à utiliser une connexion sécurisée. Mon certificat https est émis par letsencrypt (via l'option webroot), ce qui signifie qu'ils se connectent via http où je sers le contenu statique de /.well-known/acme-challenge/. Toutes les autres demandes doivent être redirigées pour utiliser https. Suite à la partie pertinente de mon nginx.confnginx: comment rediriger vers https tout en servant un répertoire via http?

server { 
    listen 80; 
    listen [::]:80; 
    server_name example.com www.example.com admin.example.com; 
    location /.well-known/acme-challenge { 
     root /app; 
     access_log on; 
     try_files $uri $uri/ =418; 
    } 

    return 301 https://$server_name$request_uri; 
} 

Cette mise à jour https fonctionne très bien et tous les utilisateurs obtenir une connexion https comme prévu. Le problème est que nginx met à jour TOUTES les requêtes faites, même celles de letsencrypt, qui provoquent l'échec de letsencrypt - il n'essaie même pas de servir le fichier (le fichier existe!). Comment est-ce que je peux m'assurer que si une demande vient via http à example.com/.well-known/acme-challenge/[HASH] il servira le dossier si trouvé ou renverra une erreur 418 tout en améliorant simultanément toutes les autres demandes à https qui ne commencent pas par /.well-known/acme-challenge? Merci pour toutes les suggestions

Répondre

2

Le return 301 est dans la portée du serveur, ce qui n'est pas ce que vous voulez. Placez le return dans un emplacement par défaut:

location/{ 
    return 301 https://$server_name$request_uri; 
} 
+0

Il devait être tard le soir, car c'est ce que j'avais « l'origine », mais quelque chose ne fonctionnait pas si je l'ai changé en fonction des ressources que j'ai trouvé. Maintenant réveillé, cela fonctionne évidemment comme prévu! merci de m'avoir montré la lumière du tunnel;) – japrescott