2012-07-04 19 views
22

Ho il seguente frammento di configurazione nginx:Nginx Rimuovere WWW e rispondere agli Sia

server { 
    listen 80; 

    server_name mydomain.io; 

    root /srv/www/domains/mydomain.io; 

    index index.html index.php; 

    access_log /var/log/nginx/domains/mydomain.io/access.log; 
    error_log /var/log/nginx/domains/mydomain.io/error.log; 

    location ~\.php { 
     try_files $uri =404; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_intercept_errors on; 
     fastcgi_pass 127.0.0.1:9000; 
     include /etc/nginx/fastcgi_params; 
    } 
} 

In primo luogo, come posso fare rispondono blocco del server per bothhttp://www.mydomain.io e anche http://mydomain.io. In secondo luogo, voglio forzare se vengono da http://www.mydomain.io per reindirizzare a http://mydomain.io.

Grazie.

risposta

-17

Sulla prima questione - è sufficiente aggiungere entrambi i domini:

server_name mydomain.io www.mydomain.io; 

Per il secondo, avrete bisogno di questo semplice redirect:

server { 
     listen 80; 

     server_name www.mydomain.io mydomain.io; 

     if ($host = 'www.mydomain.io') { 
     rewrite ^/(.*)$ http://mydomain.io/$1 permanent; 
     } 
+5

L'utilizzo di un caso nelle configurazioni di nginx è fortemente sconsigliato: http://wiki.nginx.org/IfIsEvil. Piuttosto usa due blocchi server come suggerito da @Gerry – Jrgns

+3

@Jrgns: Inoltre, 'rewrite' è menzionato come una delle due" cose al 100% sicure che possono essere fatte all'interno se in un contesto di localizzazione "nel wiki nginx ... – Tisho

+2

Se questo ottiene abbastanza voti bassi che il suo valore è negativo il sistema lo conserverà ancora come la risposta selezionata? – Bryson

13

Credo sia meglio aggiungere due blocchi di server separati per evitare controlli non necessari tramite il blocco if. Uso anche la variabile $ scheme in modo che le richieste HTTPS non vengano reindirizzate alle loro controparti non sicure.

server { 
    listen 80; 

    server_name www.mydomain.io; 

    rewrite^$scheme://mydomain.io$uri permanent; 
} 

server { 
    listen 80; 

    server_name mydomain.io; 

    # your normal server block definitions here 
} 
+3

Ho votato per errore, ma è anche una risposta errata. L'uso di "riscrittura" in questo modo è altamente scoraggiato dalla stessa documentazione NGINX. Per favore vedi la risposta di Ryan sull'uso corretto dello schema 'return 301 $: //domain.com$request_uri; ' – Bryson

137

Secondo https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if, si dovrebbe usare:

server { 
    server_name www.example.com; 
    return 301 $scheme://example.com$request_uri; 
} 
server { 
    server_name example.com; 
    # [...] 
} 
+20

Si prega di upvotare questo, persone. Mi rattrista vedere la risposta meno adatta accettata, la seconda migliore con la maggioranza dei voti ... nel frattempo la risposta corretta languisce. La risposta di Gerry è migliore di quella di Tisho, tuttavia la risposta di Ryan qui è il modo migliore per farlo. Pensaci. Vuoi che il server risponda a due richieste per ogni richiesta che arriva a www? No, no non lo fai. – Charlesism

+2

Totalmente d'accordo !! – Bazinga777

+0

Sto usando un blocco più generale che gestisce il mio server locale (localhost). sfortunatamente, questo significa che nella produzione '' Non si lascia cadere '.come posso migliorare questo blocco? (ci scusiamo per la scarsa formulazione) server { listen 80; nome_server ~^(www | app) \. (. *) $; ritorno 301 $ schema: // $ 1 $ request_uri; } – robinnnnn

2

Un altro modo di codice è:

if ($http_host ~* "^www\.(.+)$"){ 
    rewrite ^(.*)$ http://%1$request_uri redirect; 
} 

Funziona anche con più nomi di dominio sullo stesso codice.

-1
server { 
    listen 80; 
    server_name www.mydomain.io; 
    return 301 https://$host$request_uri; 
} 

server { 
    listen 80; 
    server_name mydomain.io; 
    ... 
} 
+0

L'host $ variabile nel blocco del primo server ha il valore "www.mydomain.io". Quindi reindirizza la richiesta da http: // www.mydomain.io a https: // www.mydomain.io ma non a mydomain.io come richiesto –

Problemi correlati