2012-07-04 38 views
22

Tengo el siguiente fragmento de configuración de nginx:Nginx Eliminar WWW y responder a los dos

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; 
    } 
} 

En primer lugar, ¿cómo puedo hacer que el servidor responda bloque a bothhttp://www.mydomain.io y también http://mydomain.io. En segundo lugar, quiero forzar si provienen de http://www.mydomain.io para redirigir a http://mydomain.io.

Gracias.

Respuesta

-17

En la primera pregunta - sólo tiene que añadir los dos dominios:

server_name mydomain.io www.mydomain.io; 

Para el segundo, necesitará este simple redirección:

server { 
     listen 80; 

     server_name www.mydomain.io mydomain.io; 

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

El uso de un caso en las configuraciones de nginx no es recomendable: http://wiki.nginx.org/IfIsEvil. Más bien use dos bloques de servidores como lo sugiere @Gerry – Jrgns

+3

@Jrgns: Además, 'rewrite' se menciona como una de las dos" cosas 100% seguras que se pueden hacer dentro si está en contexto de ubicación "en la wiki de nginx ... – Tisho

+2

If esto tiene suficientes votos negativos que su valor es negativo ¿el sistema aún lo conservará como la respuesta seleccionada? – Bryson

13

Creo que es mejor agregar dos bloques servidor separado para evitar una verificación innecesaria por el bloque if. También uso la variable $ scheme para que las solicitudes HTTPS no se redirijan a sus contrapartes inseguras.

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

He votado por error, pero también es una respuesta incorrecta. El uso de 'rewrite' de esta manera es altamente desaconsejado por la propia documentación de NGINX. Por favor, vea la respuesta de Ryan sobre el uso apropiado de 'return 301 $ scheme: //domain.com$request_uri;' – Bryson

137

Según https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if, se debe utilizar:

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

Por favor, vota esto, gente. Me entristece ver aceptada la respuesta menos adecuada, la segunda mejor con la mayoría de los votos ... mientras tanto, la respuesta correcta languidece. La respuesta de Gerry es mejor que la de Tisho, sin embargo, la respuesta de Ryan es la manera recomendada de hacerlo. Piénsalo. ¿Desea que el servidor responda dos solicitudes por cada solicitud que recibe a www? No, no, no. – Charlesism

+2

Totalmente de acuerdo !! – Bazinga777

+0

Estoy usando un bloque más general que maneja mi servidor local (localhost). desafortunadamente, esto significa que en la producción 'www.' no se descarta.¿Cómo puedo mejorar este bloque? (disculpas por el pobre formateo) servidor { listen 80; server_name ~^(www | app) \. (. *) $; return 301 $ scheme: // $ 1 $ request_uri; } – robinnnnn

2

Otra manera de codificarlo:

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

Funciona incluso con varios nombres de dominio en el mismo código.

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

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

El host $ variable en el primer bloque de servidor tiene el valor "www.mydomain.io". Por lo tanto, redirecciona la solicitud desde http: // www.midominio.io a https: // www.midominio.io pero no a mydomain.io según lo solicitado –

Cuestiones relacionadas