Come reindirizzare a un dominio diverso utilizzando NGINX?


136

Come faccio a reindirizzare mydomain.come qualsiasi sottodominio *.mydomain.comdi www.adifferentdomain.comutilizzare Nginx?

Risposte:


276

nome_server supporta le corrispondenze dei suffissi utilizzando la sintassi .mydomain.com:

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

o su qualsiasi versione 0.9.1 o successiva:

server {
  server_name .mydomain.com;
  return 301 http://www.adifferentdomain.com$request_uri;
}

1
Non è necessario inserire una porta per l'ascolto? ad esempio, ascolto 80. Ho più domini che devo reindirizzare a un dominio primario, ma il mio server ha anche più server virtuali per vari altri domini.
Ryan,

1
@Ryan La listendirettiva passa automaticamente alla porta 80 quando non viene specificata. In realtà è un po 'più complicato di quello in generale; vedere i documenti di configurazione di nginx per maggiori dettagli.
Yitz,

2
Cosa ?ottiene alla fine?
Dan Dascalescu il

5
Qual è la differenza tra rewritee return 301 $scheme://www.adifferentdomain.com$request_uri;?
Dan Dascalescu il

6
Il ? alla fine di una riscrittura dice a nginx di non aggiungere la stringa di query originale. Poiché $request_uriha già la stringa di query, non è necessario aggiungerla di nuovo. La return 301sintassi è più recente e non dovrebbe esserci alcuna differenza nel comportamento tra i due metodi, ma quando inizialmente ho risposto a questa domanda, molte distribuzioni non avevano la versione richiesta, quindi sono andato con la sintassi più sicura.
kolbyjack,


15

Perché usare il modulo di riscrittura se puoi farlo return? Tecnicamente parlando, returnfa parte del modulo di riscrittura come puoi leggere qui, ma questo frammento è più facile da leggere imho.

server {
    server_name  .domain.com;

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

Puoi anche dargli un reindirizzamento 301.


1
Ciò manterrà anche i parametri di percorso e query?
Aprire il

3
No, questo esempio non lo fa @Mark. Ma suppongo che tu possa mescolare le risposte precedenti per trovare qualcosa del genere:return 302 $scheme://forwarded-domain.com$request_uri;
Robin van Baalen,

In una nota a margine, in molti casi, probabilmente dovresti semplicemente reindirizzare a https invece di preservare lo schema (cioè usa https invece di $ schema). Questo è per gli stessi motivi per cui i collegamenti relativi al protocollo sono ora considerati obsoleti
paulirish.com/2010/the-protocol-relative-url

@mahemoff Non è del tutto vero. Considera il caso di avere il server web dietro un bilanciamento del carico che sta scaricando ssl.
Sebastian Neira,

11

Dovrebbe funzionare tramite HTTPRewriteModule .

Esempio di riscrittura da www.esempio.com a esempio.com:

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

che sta semplicemente reindirizzando www.example.com a example.com. Voglio reindirizzare entrambi su un dominio diverso. Posso farlo in una regola?
deb.

Non lo so per certo, ma penso che nome_server mydomain.com; riscrivere www.adifferentdomain.com permanente; } dovrebbe farlo? Ciò dovrebbe richiedere tutto * .mydomain.com?
Udo

@deb avresti semplicemente server_name example.com www.example.com;.
citruspi,

La domanda richiede specificamente che tutti i sottodomini vengano reindirizzati a un dominio diverso . Questa risposta non risponde a nessuno dei due (esplicitamente).
Kissaki,

questo manca l'importante 301!
Sliq,

9

Se desideri reindirizzare le richieste di "domain1.com" a "domain2.com", puoi creare un blocco server simile al seguente:

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}

Qualcuno potrebbe dover reindirizzare anche https: // request. listen 443;
Rafik Farhad,

0

Reindirizzamento temporaneo

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

Reindirizzamento permanente

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

Nel file di configurazione nginx per sito specifico:

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

}

0

Puoi semplicemente scrivere una condizione if all'interno del blocco server {}:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}

Devi stare attento usando le istruzioni "if" su Nginx ( nginx.com/resources/wiki/start/topics/depth/ifisevil ). In questo caso puoi semplicemente usare "nome_server mydomain.com".
Marty

se è male quando usato nel contesto della posizione, è sicuro se usato per specificare l'host di reindirizzamento
cryptoKTM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.