Nginx elimina WWW y responde a ambos

Tengo el siguiente fragmento de configuración de nginx:

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

Primero, ¿cómo puedo hacer que el bloque del servidor responda a both http://www.mydomain.io y también http://mydomain.io. Segundo, quiero forzar si vienen de http://www.mydomain.io para redirigir a http://mydomain.io.

Gracias.

preguntado el 04 de julio de 12 a las 07:07

6 Respuestas

Según https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if, Deberías usar:

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

respondido 04 mar '17, 22:03

Por favor, voten esto, gente. Me entristece ver que se acepta la respuesta menos adecuada, la segunda mejor con la mayoría de los votos... mientras languidece la respuesta correcta. La respuesta de Gerry es mejor que la de Tisho, sin embargo, la respuesta de Ryan aquí es la forma recomendada. Piénsalo. ¿Quiere que el servidor responda a dos solicitudes por cada solicitud que llegue a www? No, no, no lo haces. - nombre_usuario_original

Estoy usando un bloque más general que maneja mi servidor local (localhost). desafortunadamente, esto significa que en la producción www. no se cae. ¿Cómo puedo mejorar este bloque? (disculpas por el mal formato) server { listen 80; nombre_servidor ~^(www|aplicación)\.(.*)$; return 301 $esquema://$1$request_uri; } - robinnnnn

El enlace de la página wiki de nginx pitfalls anterior está roto. ahora debería ser nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls. Además, si desea encontrar la información anterior en ese enlace, busque 'Using if'. ¡Gracias Ryan! ¡Funcionó muy bien! - drogadicto

Gracias @junkie! Actualizado. - Ryan

No hay listen declaración en el código incluido en esta respuesta. Sin él, esto no funcionará. - ishan jain

Creo que es mejor agregar dos bloques de servidor separados para evitar una verificación innecesaria por parte del if cuadra. 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
}

Respondido el 07 de enero de 13 a las 08:01

Voté esto por error, pero también es una respuesta incorrecta. El uso de rewrite de esta manera está muy desaconsejado por la propia documentación de NGINX. Consulte la respuesta de Ryan sobre el uso adecuado de return 301 $scheme://domain.com$request_uri; - Bryson

Para un enfoque genérico, sin tener que mencionar ningún dominio o protocolo específico, he usado esto con bastante éxito:

  # rewrite to remove www.
  if ( $host ~ ^www\.(.+)$ ) {
    set $without_www $1;
    rewrite ^ $scheme://$without_www$uri permanent;
  }

Esto redirigirá: https://www.api.example.com/person/123?q=45 a https://api.example.com/person/123?q=45

Respondido 14 ago 17, 15:08

Otra forma de codificarlo:

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

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

Respondido 08 Jul 14, 19:07

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

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

Respondido el 23 de junio de 16 a las 09:06

La variable $host en el primer bloque del servidor tiene el valor "www.mydomain.io". Entonces redirige la solicitud de http:// www.mydomain.io a https:// www.mydomain.io pero no a mydomain.io como se solicitó. Alejandro Ushakov

En la primera pregunta, simplemente agregue ambos dominios:

server_name mydomain.io www.mydomain.io;

Para el segundo, necesitarás esta simple redirección:

server {
      listen 80;

      server_name www.mydomain.io mydomain.io;

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

Respondido 04 Jul 12, 09:07

No se recomienda encarecidamente usar un if en las configuraciones de nginx: wiki.nginx.org/IfIsEvil . Más bien use dos bloques de servidor como lo sugiere @Gerry: Jrgns

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

Si esto obtiene suficientes votos negativos como para que su valor sea negativo, ¿el sistema aún lo conservará como la respuesta seleccionada? - Bryson

Esta solución (o similar) es aceptable en algunos casos. Por ejemplo, si tiene expresiones regulares o comodines server_name, Tales como server_name ~^.*\.mydomain\.(com|net|org)$ probablemente no desee duplicar el código con otros server bloques, por lo que puede utilizar algo como if ($host ~ "^www\.(.*)$") { #do redirect }. Por cierto, esto if no está dentro location contexto ;) - Oleg

He intentado con bloques de servidor separados pero, aunque Nginx está respondiendo a ambos, no sé por qué sucede esto, pero incluso después de eliminar server_name www.mydomain.com de mi bloque de servidor original, nginx sigue respondiendo a la solicitud. Final, obtuve su respuesta para manejarlo a través de la condición IF, gracias @Tisho - Tapas Thakkar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.