531 votes

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

J'utilise nginx sur Rackspace cloud à la suite d'un tutoriel, cherché sur le net et pour l'instant ne pouvez pas obtenir cette triés.

Je veux www.mysite.com pour aller à mysite.com normal dans .htaccess pour le référencement et pour d'autres raisons.

Mon vi /etc/nginx/sites-available/www.exemple.com.vhost code:

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é. La deuxième tente de donner rediriger les erreurs sur la boucle.

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

(exemple de l'IPs et de dossiers ont été utilisé pour les exemples et à aider les gens dans le futur). J'utilise Ubuntu 11.

815voto

TheBlackBenzKid Points 6248

HTTP Solution

À partir de la documentation, "le droit est de définir un serveur distinct 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 comprenant 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 initialement incluses https:// dans ma solution, car nous les utilisons loadbalancers et notre https:// serveur est un haut-le trafic SSL serveur de paiement: nous ne mélangez pas https:// et http://.


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

Bande www à partir de l'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#
}

Si vous avez besoin d'avoir DEUX serveur codes.

Ajouter le web à l'url avec nginx redirect

Si ce que vous avez besoin est à l'opposé, pour rediriger de domain.com pour 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 tout le contraire et fonctionne de la même manière le premier exemple. De cette façon, vous n'obtenez pas de RÉFÉRENCEMENT des marques vers le bas, comme il est complet perm de redirection et de se déplacer. Le pas de WWW est forcé et que le répertoire indiqué!

Certains de mes 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;
       }
}

422voto

Fleshgrinder Points 4529

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 devient de plus en plus de voix mais la ci-dessus. Vous ne devez jamais utiliser un rewrite dans ce contexte. Pourquoi? Parce que nginx a de processus et de lancer une recherche. Si vous utilisez return (ce qui devrait être disponible dans toutes les nginx version) directement arrête l'exécution. C'est préféré dans n'importe quel contexte.

Rediriger tous les deux, non-SSL et SSL pour leur non-www homologue:

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

server {
    listen 80;
    listen 443 ssl;
    server_name example.com;
    # rest goes here...
}

L' $scheme variable ne contiennent http si votre serveur est en écoute sur le port 80 (par défaut) et l'écoute de l'option ne contient pas l' ssl mot-clé. Ne pas utiliser la variable ne sera pas le gain de performance.

Rediriger la sortie vers le protocole SSL (configuration personnel sur 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.

12voto

Kevin Nguyen Points 83

Essayez ceci

3voto

steven Points 96

ne sais pas si vous l’aviez remarqué qu'il peut être correct retourner un étrangleur 301 mais navigateurs là-dessus pour faire

est plus rapide que :

-6voto

undoIT Points 308

Si vous rencontrez des difficultés à obtenir ce travail, vous devrez peut-être ajouter l’adresse IP de votre serveur. Par exemple :

où XXX.XXX.XXX.XXX est l’adresse IP (évidemment).

Remarque : emplacement de TCR et clé ssl doit être défini pour rediriger correctement les requêtes https

N’oubliez pas de redémarrer nginx après avoir apporté les modifications :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X