Comment rediriger vers un domaine différent en utilisant NGINX?

136

Comment puis-je rediriger mydomain.comet tout sous-domaine *.mydomain.comvers l' www.adifferentdomain.comutilisation de NGINX?

deb
la source

Réponses:

276

nom_serveur prend en charge les correspondances de suffixes à l'aide de la syntaxe .mondomaine.com:

server {
  server_name .mydomain.com;
  rewrite ^ http://www.adifferentdomain.com$request_uri? permanent;
}

ou sur n'importe quelle version 0.9.1 ou supérieure:

server {
  server_name .mydomain.com;
  return 301 http://www.adifferentdomain.com$request_uri;
}
kolbyjack
la source
1
N'ai-je pas besoin de mettre dans un port pour écouter? par exemple écouter 80. J'ai plusieurs domaines que je dois rediriger vers un domaine principal, mais mon serveur a également plusieurs serveurs virtuels pour divers autres domaines.
Ryan
1
@Ryan La listendirective utilise par défaut le port 80 lorsqu'elle n'est pas spécifiée. C'est en fait un peu plus compliqué que cela en général; voir la documentation de configuration de nginx pour plus de détails.
Yitz
2
Que réalise-t-il ?à la fin?
Dan Dascalescu
5
Quelle est la différence entre rewriteet return 301 $scheme://www.adifferentdomain.com$request_uri;?
Dan Dascalescu
6
Le ? à la fin d'une réécriture, indique à nginx de ne pas ajouter la chaîne de requête d'origine. Puisqu'il a $request_uridéjà la chaîne de requête, il n'est pas nécessaire de l'ajouter à nouveau. La return 301syntaxe est plus récente et il ne devrait y avoir aucune différence de comportement entre les deux méthodes, mais lorsque j'ai initialement répondu à cette question, de nombreuses distributions n'avaient pas la version requise, j'ai donc opté pour la syntaxe la plus sûre.
kolbyjack
15

Pourquoi utiliser le module de réécriture si vous pouvez le faire return? Techniquement parlant, returnfait partie du module de réécriture comme vous pouvez le lire ici, mais cet extrait est plus facile à lire à mon humble avis.

server {
    server_name  .domain.com;

    return 302 $scheme://forwarded-domain.com;
}

Vous pouvez également lui donner une redirection 301.

Robin van Baalen
la source
1
Cela conservera-t-il également le chemin et les paramètres de requête?
mpen
3
Non, cet exemple ne fait pas ça @Mark. Mais je suppose que vous pouvez mélanger les réponses précédentes pour trouver quelque chose comme ceci:return 302 $scheme://forwarded-domain.com$request_uri;
Robin van Baalen
Par ailleurs, dans de nombreux cas, vous devriez probablement simplement rediriger vers https au lieu de préserver le schéma (c'est-à-dire utiliser https au lieu de $ schéma). C'est pour les mêmes raisons que les liens relatifs au protocole sont maintenant considérés comme obsolètes - paulirish.com/2010/the-protocol-relative-url
mahemoff
@mahemoff Ce n'est pas tout à fait vrai. Prenons le cas du serveur Web derrière un équilibreur de charge qui décharge ssl.
Sebastian Neira
11

Cela devrait fonctionner via HTTPRewriteModule .

Exemple de réécriture de www.example.com vers example.com:

server {    
    server_name www.example.com;    
    rewrite ^ http://example.com$request_uri? permanent; 
}
tu fais
la source
cela ne fait que rediriger www.example.com vers example.com. Je souhaite rediriger les deux vers un domaine différent. Puis-je faire cela en une seule règle?
deb
Je ne sais pas avec certitude, mais je pense que nom_serveur mydomaine.com; réécrire www.adifferentdomain.com de manière permanente; } devrait le faire? Cela devrait prendre tout * .mydomain.com?
udo
@deb vous auriez juste server_name example.com www.example.com;.
citruspi
La question demande spécifiquement à tous les sous-domaines de rediriger vers un domaine différent . Cette réponse ne répond à aucun des deux (explicitement).
Kissaki
il manque l'important 301!
Sliq
9

Si vous souhaitez rediriger les demandes de "domain1.com" vers "domain2.com", vous pouvez créer un bloc de serveur qui ressemble à ceci:

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}
ZanMax
la source
Quelqu'un peut également avoir besoin de rediriger la requête https: //. listen 443;
Rafik Farhad le
0

Redirection temporaire

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? redirect;

Redirection permanente

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? permanent;

Dans le fichier de configuration nginx pour un site spécifique:

server {    
    server_name www.example.com;
    rewrite ^ http://www.RedictToThisDomain.com$request_uri? redirect;

}
Taimoor Changaiz
la source
0

Vous pouvez simplement écrire une condition if dans le bloc server {}:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}
cryptoKTM
la source
Vous devez être prudent en utilisant les instructions «if» sur Nginx ( nginx.com/resources/wiki/start/topics/depth/ifisevil ). Dans ce cas, vous pouvez simplement utiliser «nom_serveur mondomaine.com» à la place.
Marty le
si est mal lorsqu'il est utilisé dans un contexte de localisation, il est sûr lorsqu'il est utilisé pour spécifier l'hôte de redirection
cryptoKTM