web-dev-qa-db-fra.com

La configuration Nginx conduit à une boucle de redirection sans fin

J'ai donc examiné tous les exemples de configuration que j'ai pu trouver et pourtant, chaque fois que j'essaie de visualiser une page qui nécessite SSL, je me retrouve dans une boucle de redirection. J'utilise nginx/0.8.53 et passager 3.0.2.

Voici la configuration SSL

server  {
  listen 443 default ssl;
  server_name <redacted>.com www.<redacted>.com;
  root /home/app/<redacted>/public;
  passenger_enabled on;
  Rails_env production;  
  ssl_certificate      /home/app/ssl/<redacted>.com.pem;
  ssl_certificate_key  /home/app/ssl/<redacted>.key;

  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_set_header  X_FORWARDED_PROTO https;
  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header  Host $http_Host;
  proxy_set_header  X-Url-Scheme $scheme;
  proxy_redirect    off;
  proxy_max_temp_file_size 0;

  location /blog {
    rewrite ^/blog(/.*)?$ http://blog.<redacted>.com/$1 permanent;
  }

  location ~* \.(js|css|jpg|jpeg|gif|png)$ {
    if (-f $request_filename) {
      expires      max;
      break;
    }
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

Voici la configuration non SSL

server  {
  listen 80;
  server_name <redacted>.com www.<redacted>.com;
  root /home/app/<redacted>/public;
  passenger_enabled on;
  Rails_env production;  

  location /blog {
    rewrite ^/blog(/.*)?$ http://blog.<redacted>.com/$1 permanent;
  }

  location ~* \.(js|css|jpg|jpeg|gif|png)$ {
    if (-f $request_filename) {
      expires      max;
      break;
    }
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

Faites-moi savoir s'il y a des informations supplémentaires que je peux donner pour aider à diagnostiquer le problème.

27
brianthecoder

C'est votre ligne ici:

  listen 443 default ssl;

changez-le en:

listen 443;
ssl on;

C'est ce que j'appellerai l'ancien style. De plus, avec

              proxy_set_header X_FORWARDED_PROTO https;
              proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header  Host $http_Host;
              proxy_set_header  X-Url-Scheme $scheme;
              proxy_redirect    off;
              proxy_max_temp_file_size 0;

a fait l'affaire pour moi. Je vois maintenant que je manque la vraie ligne IP que vous avez, mais jusqu'à présent, cela m'a débarrassé de mon problème de boucle infinie avec ssl_requirement et ssl_enforcer.

31
pjammer

J'ai trouvé que c'était cette ligne

 proxy_set_header  Host $http_Host;

Qui devrait être changé en

 proxy_set_header  Host $Host;

Selon la documentation de nginx en utilisant '$ http_Host, vous passez "l'en-tête de demande inchangé".

6
toxaq

Avez-vous essayé d'utiliser "X-Forwarded-Proto" au lieu de X_FORWARDED_PROTO?

J'ai déjà rencontré un problème avec cet en-tête, il ne provoquait pas de redirection, mais le modifier a été corrigé pour moi.

5
britg

Puisque vous avez une instruction de réécriture trouvée dans les sections ssl et non-ssl

location /blog {
  rewrite ^/blog(/.*)?$ http://blog.<redacted>.com/$1 permanent;
}

Où se trouve la section serveur de blog..com ?? Cela pourrait-il être à l'origine du problème?

4
Peter Petrik

J'ai eu un problème similaire pour mon application symfony2, bien que sous une forme différente: j'avais défini fastcgi_param HTTPS off; quand j'avais bien sûr besoin de fastcgi_param HTTPS on; dans ma configuration nginx.

    location ~ ^/(app|app_dev|config)\.php(/|$) {
            satisfy any;
            allow all;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param HTTPS on;
    }
3
k0pernikus

Au cas où quelqu'un d'autre trébucherait sur cela, j'essayais de configurer à la fois http et https via le même bloc serveur {}, mais j'ai seulement ajouté la directive "écouter 443" en pensant que "cette ligne est implicite et implicite" signifiait qu'elle le ferait également écoutez le 80 aussi, ce n'est pas le cas. Le fait de ne pas commenter la ligne "Listen 80" afin que les deux lignes d'écoute soient présentes corrige la boucle infinie. Aucune idée de la raison pour laquelle il aurait même reçu une redirection, mais c'est le cas.

1
Brian J. Miller

Pour ceux qui cherchent désespérément pourquoi leur propre cloud continue de faire une boucle de redirection malgré un bon fichier de configuration, j'ai trouvé pourquoi cela ne fonctionne pas.

Ma config: nginx + php-fpm + mysql sur un nouveau centos 6.5

lors de l'installation de php-fpm et nginx, l'autorisation par défaut sur/var/lib/php/session/est root: Apache

php-fpm à travers la session php du magasin nginx ici, si nginx n'avait pas l'autorisation de l'écrire, échouera misérablement à garder une session de connexion, ce qui entraînera une boucle infinie.

Il suffit donc d'ajouter nginx dans le groupe Apache (usermod -a -G Apache nginx) ou de changer la propriété de ce dossier.

Bonne journée.

1
user3613475

J'ai joué avec un tas de ces réponses mais rien n'a fonctionné pour moi. Puis j'ai réalisé que depuis que j'utilise Cloudflare, le problème peut ne pas être sur le serveur mais avec Cloudflare. Et voilà quand j'ai défini mon SSL sur Full (Strict) tout fonctionne comme il se doit!

cloudflare ssl

0
Zaki Aziz

X_FORWARDED_PROTO comme dans votre fichier peut provoquer des erreurs et ce fut le cas dans mon cas. X-Forwarded-Proto est correct alors que les hiphens sont plus importants que les lettres majuscules ou minuscules.

Vous pouvez éviter ces problèmes en respectant les conventions;)

voir aussi ici: En-têtes HTTP personnalisés: conventions de dénomination et ici: http://www.ietf.org/rfc/rfc2047.txt

0
Steven