Question Nginx non-www à www et www à non-www


j'utilise nginx sur le cloud Rackspace suite à un tutoriel et après avoir cherché sur le net et jusqu'ici ne peut pas obtenir ce trié.

Je souhaite que www.monsite.com se connecte normalement à mysite.com dans .htaccess pour le référencement et autres raisons.

ma /etc/nginx/sites-available/www.example.com.vhost config:

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

J'ai aussi essayé

server {
       listen 80;
       server_name example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

J'ai aussi essayé. Les deux tentatives donnent des erreurs de boucle de redirection.

if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}

Mon DNS est configuré en standard:

site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds

(Par exemple, les adresses IP et les dossiers ont été utilisés pour des exemples et pour aider les utilisateurs à l'avenir). J'utilise Ubuntu 11.


428
2017-10-30 18:56


origine


Réponses:


Solution HTTP

Du Documentation, "la bonne façon est de définir un serveur séparé pour example.org":

server {
    listen       80;
    server_name  example.com;
    return       301 http://www.example.com$request_uri;
}

server {
    listen       80;
    server_name  www.example.com;
    ...
}

Solution HTTPS

Pour ceux qui veulent une solution incluant https://...

server {
        listen 80;
        server_name www.domain.com;
        # $scheme will get the http protocol
        # and 301 is best practice for tablet, phone, desktop and seo
        return 301 $scheme://domain.com$request_uri;
}

server {
        listen 80;
        server_name domain.com;
        # here goes the rest of your config file
        # example 
        location / {

            rewrite ^/cp/login?$ /cp/login.php last;
            # etc etc...

        }
}

Note: Je n'ai pas inclus à l'origine https:// dans ma solution puisque nous utilisons loadbalancers et notre serveur https: // est un serveur de paiement SSL à fort trafic: nous ne mélangeons pas https: // et http: //.


Pour vérifier la version de nginx, utilisez nginx -v.

Bande www d'url avec nginx redirect

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

server {
    server_name  domain.com;
    #The rest of your configuration goes here#
}

Vous devez donc avoir deux codes de serveur.

Ajoutez le www à l'URL avec la redirection nginx

Si ce dont vous avez besoin est le contraire, pour rediriger de domain.com à www.domain.com, vous pouvez utiliser ceci:

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

server {
    server_name  www.domain.com;
    #The rest of your configuration goes here#
}

Comme vous pouvez l'imaginer, c'est exactement le contraire et fonctionne de la même manière que le premier exemple. De cette façon, vous n’obtenez pas les marques SEO, car il s’agit d’une redirection et d’un déplacement complets. Le non WWW est forcé et le répertoire affiché!

Une partie de mon code ci-dessous pour une meilleure vue:

server {
    server_name  www.google.com;
    rewrite ^(.*) http://google.com$1 permanent;
}
server {
       listen 80;
       server_name google.com;
       index index.php index.html;
       ####
       # now pull the site from one directory #
       root /var/www/www.google.com/web;
       # done #
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
}

725
2017-10-31 19:18



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 devriez jamais utiliser un rewrite dans ce contexte. Pourquoi? Parce que nginx doit traiter et lancer une recherche. Si tu utilises return (qui devrait être disponible dans n'importe quelle version de nginx) il arrête directement l'exécution. Ceci est préféré dans n'importe quel contexte.

Redirige les deux, non-SSL et SSL vers leur contrepartie non-www:

server {
    listen               80;
    listen               443 ssl;
    server_name          www.example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    return 301 $scheme://example.com$request_uri;
}

server {
    listen               80;
    listen               443 ssl;
    server_name          example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    # rest goes here...
}

le $scheme la variable ne contiendra que http Si votre serveur n'écoute que le port 80 (par défaut) et que l'option d'écoute ne contient pas le ssl mot-clé. Ne pas utiliser la variable ne vous apportera aucune performance.

Notez que vous avez besoin de davantage de blocs de serveur si vous utilisez HSTS, car les en-têtes HSTS ne doivent pas être envoyés via des connexions non chiffrées. Par conséquent, vous avez besoin de blocs de serveur non chiffrés avec des redirections et des blocs de serveur chiffrés avec des redirections et des en-têtes HSTS.

Tout rediriger vers SSL (config personnel sous UNIX avec IPv4, IPv6, SPDY, ...):

#
# Redirect all www to non-www
#
server {
    server_name          www.example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:80;
    listen               *:443 ssl spdy;
    listen               [::]:80 ipv6only=on;
    listen               [::]:443 ssl spdy ipv6only=on;

    return 301 https://example.com$request_uri;
}

#
# Redirect all non-encrypted to encrypted
#
server {
    server_name          example.com;
    listen               *:80;
    listen               [::]:80;

    return 301 https://example.com$request_uri;
}

#
# There we go!
#
server {
    server_name          example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:443 ssl spdy;
    listen               [::]:443 ssl spdy;

    # rest goes here...
}

Je suppose que vous pouvez imaginer d'autres composés avec ce modèle maintenant par vous-même.

Plus de mes configs? Aller ici et ici.


348
2017-07-31 04:58



Vous pouvez découvrir que vous souhaitez utiliser la même configuration pour plusieurs domaines.

L'extrait suivant supprime www avant tout domaine:

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

27
2018-05-14 14:46



Voici comment faire pour plusieurs noms de serveur www à no-www (je l'ai utilisé pour les sous-domaines):

server {
        server_name 
             "~^www\.(sub1.example.com)$"
             "~^www\.(sub2.example.com)$"
             "~^www\.(sub3.example.com)$";
         return 301 $scheme://$1$request_uri ;
}

19
2017-12-10 17:00



Vous avez besoin de deux blocs de serveur.

Mettez-les dans votre fichier de configuration, par exemple /etc/nginx/sites-available/sitename

Disons que vous décidez d'avoir http://exemple.com comme adresse principale à utiliser.

Votre fichier de configuration devrait ressembler à ceci:

server {
        listen 80;
        listen [::]:80;
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}
server {
        listen 80;
        listen [::]:80;
        server_name example.com;

        # this is the main server block
        # insert ALL other config or settings in this server block
}

Le premier bloc de serveur contiendra les instructions pour rediriger toutes les demandes avec le préfixe 'www'. Il écoute les requêtes pour l'URL avec le préfixe «www» et les redirections.

Ça ne fait rien d'autre.

Le deuxième bloc de serveur contiendra votre adresse principale - l'URL que vous souhaitez utiliser. Tous les autres paramètres vont ici comme root, index, location, etc. Vérifiez le fichier par défaut pour ces autres paramètres que vous pouvez inclure dans le bloc serveur.

Le serveur a besoin de deux enregistrements DNS A.

Name: @ IPAddress: your-ip-address (for the example.com URL)

Name: www IPAddress: your-ip-address (for the www.example.com URL)

Pour ipv6, créez la paire d'enregistrements AAAA à l'aide de votre adresse IPv6.


15
2017-08-28 13:35



Cette solution vient de mon expérience personnelle. Nous avons utilisé plusieurs compartiments Amazon S3 et un serveur pour la redirection non-www à www noms de domaine à faire correspondre S3 "Hôte" politique d'en-tête.

J'ai utilisé la configuration suivante pour nginx serveur:

server {
    listen 80;
    server_name ~^(?!www\.)(?<domain>.+)$;
    return 301 $scheme://www.$domain$request_uri;
}

Cela correspond à tous les noms de domaine pointés vers le serveur en commençant par n'importe quoi mais www. et redirige vers www.<domain>. De la même manière, vous pouvez faire la réorientation opposée de www à non-www.


14
2017-10-16 15:44



essaye ça

    if ($host !~* ^www\.){
        rewrite ^(.*)$ https://www.yoursite.com$1;
    }

Autre manière: Nginx non-www à www

server {
  listen       80;
  server_name  yoursite.com;
  root /path/;
  index index.php;
  return       301 https://www.yoursite.com$request_uri;
}

et www à no-www

server {
  listen       80;
  server_name  www.yoursite.com;
  root /path/;
  index index.php;
  return       301 https://yoursite.com$request_uri;
}

10
2017-10-08 17:18