Comment rediriger une URL dans NGINX

135

Je dois rediriger chaque requête http://test.com vers http://www.test.com . Comment cela peut-il être fait.

Dans le bloc serveur, j'ai essayé d'ajouter

 rewrite ^/(.*) http://www.test.com/$1 permanent;

mais dans le navigateur il dit

  The page isn't redirecting properly

  Firefox has detected that the server is redirecting the request for 
  this address in a way that will never complete.

mon bloc serveur ressemble à

 server {
            listen       80;
            server_name  test.com;
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            #rewrite ^/(.*) http://www.test.com/$1 permanent;
            #rewrite ^(.*)$ $scheme://www.test.com$1;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }
Amal Kumar S
la source
La documentation officielle est à: nginx.org/en/docs/http/converting_rewrite_rules.html
Marcello Nuccio

Réponses:

274

La meilleure façon de faire ce que vous voulez est d'ajouter un autre bloc de serveur:

server {
        #implemented by default, change if you need different ip or port
        #listen *:80 | *:8000;
        server_name test.com;
        return 301 $scheme://www.test.com$request_uri;
}

Et modifiez la variable nom_serveur de votre bloc de serveur principal comme suit:

server_name  www.test.com;

Important : un nouveau serverbloc est la bonne façon de faire cela, ifc'est mal . Vous devez utiliser des emplacements et des serveurs plutôt que ifsi c'est possible. Rewriteest parfois mal aussi , alors remplacé par return.

Dmitry Verhoturov
la source
19
Vous pouvez également terminer ce bloc de serveur avec return 301 http://wwww.test.com$request_uri;au lieu de la réécriture.
RCCola
6
idem @RCCola sur l'utilisation returnau lieu de rewrite. Voir la documentation
JCotton
Question, comment les blocs serveur doivent-ils être classés? le redirectpuis le main serverbloc ou le main serverbloc puis le redirect? Parce que j'ai le même problème, stackoverflow.com/questions/35451929/…
jhnferraris
La configuration de Nginx dans la question mentionnée est correcte, l'ordre n'a pas d'importance.
Dmitry Verhoturov
4
Juste un petit avertissement: faites attention à la 301redirection par rapport au 302. Vous pourriez être coincé avec une redirection permanente en cache, ce qui rend très difficile la modification de vos paramètres pour les clients qui ont déjà accédé à une URL. (Je sais que l'OP a demandé un 301, mais assurez-vous que c'est vraiment ce que vous voulez.)
Nick Merrill
16

Similaire à une autre réponse ici, mais changez le http dans la réécriture en $ schéma comme ceci:

server {
        listen 80;
        server_name test.com;
        rewrite     ^ $scheme://www.test.com$request_uri? permanent;
}

Et modifiez la variable nom_serveur de votre bloc de serveur principal comme suit:

server_name  www.test.com;

J'ai dû faire cela pour rediriger www.test.com vers test.com.

Damien Justin Šutevski
la source
9

Assurez-vous d'abord que vous avez installé Nginx avec le module de réécriture HTTP. Pour l'installer, nous avons besoin de pcre-library

Comment installer la bibliothèque pcre

Si les éléments mentionnés ci-dessus sont effectués ou si vous les avez déjà, ajoutez simplement le code ci-dessous dans votre bloc serveur nginx

  if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
  }

Pour supprimer www de chaque demande que vous pouvez utiliser

  if ($host = 'www.your_domain.com' ) {
   rewrite  ^/(.*)$  http://your_domain.com/$1  permanent;
  }

donc votre bloc serveur ressemblera à

  server {
            listen       80;
            server_name  test.com;
            if ($host !~* ^www\.) {
                    rewrite ^(.*)$ http://www.$host$1 permanent;
            }
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }
Amal Kumar S
la source
3

C'est le premier hit sur Google pour la "redirection nginx". Si vous êtes arrivé ici pour rediriger un seul emplacement:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Seph Reed
la source