Domanda

Vedo che Nginx la documentazione di HttpRewriteModule ha un esempio per riscrivere un dominio con prefisso www in un non- dominio con prefisso www:

if ($host ~* www\.(.*)) {
  set $host_without_www $1;
  rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}

Come posso fare il contrario: riscrivere un dominio con prefisso non www in un dominio con prefisso www? Ho pensato che forse avrei potuto fare qualcosa di simile al seguente, ma a Nginx non piace l'istruzione if nidificata.

if ($host !~* ^www\.) {                       # check if host doesn't start with www.
    if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) {    # check host is of the form xxx.xxx (i.e. no subdomain)
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }
}

Inoltre volevo che funzionasse per qualsiasi nome di dominio senza dire esplicitamente a Nginx di riscrivere domain1.com - > www.domain1.com, domain2.com - > www.domain2.com, ecc. poiché ho un gran numero di domini da riscrivere.

È stato utile?

Soluzione 3

Beh, immagino di non aver davvero bisogno dell'esterno " if " dato che sto controllando comunque solo i domini del modulo xxx.xxx. Quanto segue funziona per me, anche se non è robusto. Fammi sapere se esiste una soluzione migliore.

    if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }

Modifica: aggiunto un trattino all'espressione regolare poiché è un carattere valido in un nome host.

Altri suggerimenti

Come indicato nella documentazione di Nginx, dovresti evitare di utilizzare < code> if in Nginx ove possibile , poiché non appena si dispone di un if nella configurazione, il server deve valutare ogni singola richiesta per decidere se corrispondere a tale < codice> if o no.

Una soluzione migliore sarebbe più direttive server.

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

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

Se stai tentando di pubblicare un sito abilitato SSL (HTTPS), hai più o meno tre diverse opzioni.

  1. Imposta più indirizzi IP con ciascuna direttiva server in ascolto sul proprio IP (o porte diverse se questa è un'opzione per te). Questa opzione richiede certificati SSL sia per website.com che per www.website.com , quindi hai un certificato jolly, un certificato UNI (più domini) o semplicemente due certificati diversi.
  2. Esegui la riscrittura nell'applicazione.
  3. Usa la temuta direttiva if .

Esiste anche un'opzione per usare SNI, ma non sono sicuro che questo è pienamente supportato fin d'ora .

if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}
if ($host ~* ^[^.]+\.[^.]+$) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}

È possibile ottenere nomi host validi solo perché la richiesta non arriverà mai al server in caso contrario, quindi non è necessario creare la propria logica di convalida.

La documentazione di nginx mette in guardia dall'uso di if per la riscrittura. Si prega di consultare il link qui: http://wiki.nginx.org/Pitfalls#Server_Name

HTTP & amp; HTTPS senza if condizioni:

server {
    listen          80;
    listen          443;
    server_name     website.com;

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

    # Your config goes here #
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top