Comment obtenir nginx pour rediriger du domaine www vers le domaine non www?

9

Disons que je veux rediriger de www.example.com vers example.com et je veux le faire en utilisant nginx. J'ai regardé autour de moi et je n'ai vu aucune bonne documentation à ce sujet, alors j'ai pensé que je poserais et répondrais à ma propre question.

Jauder Ho
la source

Réponses:

7

J'ai également regardé cela sur le wiki Nginx et d'autres blogs et la meilleure façon en termes de performances est de faire ce qui suit:

Pour rediriger de www.example.com vers example.com en utilisant nginx (version 1.0.12 au moment de la rédaction).

server {
  server_name www.example.com;
  rewrite ^ $scheme://example.com$request_uri permanent; 
  # permanent sends a 301 redirect whereas redirect sends a 302 temporary redirect
  # $scheme uses http or https accordingly
}

server {
  server_name example.com;
  # the rest of your config goes here
}

Lorsque des demandes parviennent à example.com, aucune instruction if n'est utilisée pour les performances. Et il utilise $ request_uri plutôt que d'avoir à créer une correspondance de 1 $ qui taxe la réécriture (voir la page Nginx Common Pitfalls).

Sources:

Démon
la source
Dans mon test, les directives doivent être inversées, c'est-à-dire. la réécriture doit venir après le server {}bloc de configuration principal .
karmi
4

Après quelques fouilles et quelques faux pas, voici la solution. Le problème que j'ai rencontré est de m'assurer d'utiliser " http://example.com $ uri". L'insertion d'un / devant $ uri entraîne une redirection vers http://example.com//

  server {
    listen 80;
    server_name www.example.com;
    rewrite ^ http://example.com$uri permanent;
  }

  # the server directive is nginx's virtual host directive.
  server {
    # port to listen on. Can also be set to an IP:PORT
    listen 80;

    # Set the charset
    charset utf-8;

    # Set the max size for file uploads to 10Mb
    client_max_body_size 10M;

    # sets the domain[s] that this vhost server requests for
    server_name example.com;

    # doc root
    root /var/www/example.com;

    # vhost specific access log
    access_log  /var/log/nginx_access.log  main;


    # set vary to off to avoid duplicate headers
    gzip off;
    gzip_vary off;


    # Set image format types to expire in a very long time
    location ~* ^.+\.(jpg|jpeg|gif|png|ico)$ {
        access_log off;
        expires max;
    }

    # Set css and js to expire in a very long time
    location ~* ^.+\.(css|js)$ {
        access_log off;
        expires max;
    }

    # Catchall for everything else
    location / {
      root /var/www/example.com;
      access_log off;

      index index.html;
      expires 1d;

      if (-f $request_filename) {
        break;
      }
    }
  }
Jauder Ho
la source
4

Veuillez visiter cette question dans SO: https://stackoverflow.com/a/11733363/846634

De la meilleure réponse:

En fait, vous n'avez même pas besoin d'une réécriture.

server {
    #listen 80 is default
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    #listen 80 is default
    server_name example.com;
    ## here goes the rest of your conf...
}

Comme ma réponse obtient de plus en plus de votes, mais aussi ce qui précède. Vous ne devez jamais utiliser un rewritedans ce contexte. Pourquoi? Parce que nginx doit traiter et démarrer une recherche. Si vous utilisez return(qui devrait être disponible dans n'importe quelle version de nginx), il arrête directement l'exécution. Ceci est préférable dans n'importe quel contexte.

Ali
la source
1

Pour rediriger vers un site non www, modifiez le fichier vhost:

server {
  listen 80;
  server_name www.example.com;
  rewrite ^/(.*) http://example.com/$1 permanent;
}

«Permanent» transforme la redirection en une redirection 301. Après ce bloc de code, vous pouvez configurer le domaine sans www.

Pour rediriger des sites non www vers www:

server {
  listen 80;
  server_name example.com;
  rewrite ^/(.*) http://www.example.com/$1 permanent;
}

Thassit.

BTW, pour une configuration VPS complète en utilisant Nginx, consultez la Bible VPS sur mon site, guvnr.com, et j'espère que c'est pratique!

Joel Coel
la source
0

Voici ce que j'utilise:

# ---------------------------------------
# vHost www.example.com
# ---------------------------------------

server {

##
# Redirect www.domain.tld
##

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

}

# ---------------------------------------
# vHost example.com
# ---------------------------------------

server {

   # Something Something
}
Neel
la source