Nginx riscrive il dominio senza prefisso www nel dominio con prefisso www
-
06-07-2019 - |
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.
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.
- 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.
- Esegui la riscrittura nell'applicazione.
- Usa la temuta direttiva
if
.
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 #
}