Estoy usando nginx en la nube de Rackspace después de un tutorial y después de haber buscado en la red y hasta ahora no puedo solucionar esto.
Quiero que www.mysite.com vaya a mysite.com de manera normal en .htaccess por SEO y otras razones.
Mi /etc/nginx/sites-available/www.example.com.vhost config:
server {
listen 80;
server_name www.example.com example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
También he intentado
server {
listen 80;
server_name example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
También lo intenté. Tanto los segundos intentos dan errores de bucle de redireccionamiento.
if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}
Mi DNS está configurado de forma estándar:
site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds
(las IP y carpetas de ejemplo se han utilizado como ejemplos y para ayudar a las personas en el futuro). Yo uso Ubuntu 11.
Dashboard > Settings > General Settings
y asegúrese de que no haya ningunawww
en las URL de dirección de sitio / sitio de WordPress. No importa cómo configure su nginx, si tiene un www en estas URL, se redirigirá al que tiene www.Respuestas:
Solución HTTP
De la documentación , "la forma correcta es definir un servidor separado para example.org":
Solución HTTPS
Para aquellos que desean una solución que incluya
https://
...Nota: Originalmente no lo he incluido
https://
en mi solución ya que usamos balanceadores de carga y nuestro servidor https: // es un servidor de pago SSL de alto tráfico: no mezclamos https: // y http: //.Para verificar la versión nginx, use
nginx -v
.Eliminar www de url con redireccionamiento nginx
Por lo tanto, debe tener DOS códigos de servidor.
Agregue el www a la url con nginx redirect
Si lo que necesita es lo contrario, para redirigir de domain.com a www.domain.com, puede usar esto:
Como puede imaginar, esto es todo lo contrario y funciona de la misma manera que el primer ejemplo. De esta manera, no obtienes marcas de SEO, ya que es una redirección y movimiento permanente. ¡No se fuerza WWW y se muestra el directorio!
Algunos de mis códigos se muestran a continuación para una mejor vista:
fuente
return 301 $scheme://domain.com$request_uri;
. No hay necesidad de capturar ningún patrón, vea las trampas de NginxEn realidad, ni siquiera necesitas una reescritura.
Como mi respuesta es obtener más y más votos, pero también lo anterior. Nunca debe usar a
rewrite
en este contexto. ¿Por qué? Porque nginx tiene que procesar e iniciar una búsqueda. Si usareturn
(que debería estar disponible en cualquier versión nginx), detiene directamente la ejecución. Esto se prefiere en cualquier contexto.Redireccione ambos, no SSL y SSL a su contraparte no www:
La
$scheme
variable solo contendráhttp
si su servidor solo está escuchando en el puerto 80 (predeterminado) y la opción de escuchar no contiene lassl
palabra clave. No usar la variable no te dará ningún rendimiento.Tenga en cuenta que necesita incluso más bloques de servidor si usa HSTS, porque los encabezados HSTS no deben enviarse a través de conexiones no cifradas. Por lo tanto, necesita bloques de servidor sin cifrar con redireccionamientos y bloques de servidor cifrados con redireccionamientos y encabezados HSTS.
Redireccionar todo a SSL (configuración personal en UNIX con IPv4, IPv6, SPDY, ...):
Supongo que puedes imaginar otros compuestos con este patrón ahora solo.
¿Más de mis configuraciones? Ve aquí y aquí .
fuente
Puede descubrir que desea utilizar la misma configuración para más dominios.
El siguiente fragmento elimina www antes de cualquier dominio:
fuente
http
a$scheme
return ...
yrewrite ... last
". ¿Algún enlace actualizado a problemas de rendimiento?Necesita dos bloques de servidor.
Póngalos en su archivo de configuración, por ejemplo
/etc/nginx/sites-available/sitename
Digamos que decide tener http://example.com como la dirección principal para usar.
Su archivo de configuración debería verse así:
El primer bloque de servidor contendrá las instrucciones para redirigir cualquier solicitud con el prefijo 'www'. Escucha las solicitudes de la URL con el prefijo 'www' y redirige.
No hace nada más.
El segundo bloque de servidor contendrá su dirección principal, la URL que desea usar. Todos los demás ajustes van aquí como
root
,index
,location
, etc. Compruebe el archivo por defecto para estos otros ajustes se pueden incluir en el bloque de servidor.El servidor necesita dos registros DNS A.
Para ipv6, cree el par de registros AAAA usando su dirección-ipv6.
fuente
Aquí se explica cómo hacerlo para varios nombres de servidor de www a no-www (lo usé para subdominios):
fuente
Mejor práctica: separado
server
con código rígidoserver_name
La mejor práctica con nginx es usar un separado
server
para una redirección como esta (no compartida con laserver
de su configuración principal), para codificar todo y no usar expresiones regulares en absoluto.También puede ser necesario codificar los dominios si está usando HTTPS, ya que debe saber por adelantado qué certificados proporcionará.
Usando expresiones regulares dentro
server_name
Si tiene varios sitios y no le interesa el rendimiento máximo, pero desea que cada uno de ellos tenga la misma política con respecto al
www.
prefijo, puede usar expresiones regulares. La mejor práctica de usar un separadoserver
aún se mantendría.Tenga en cuenta que esta solución se vuelve complicada si usa https, ya que debe tener un solo certificado para cubrir todos sus nombres de dominio si desea que esto funcione correctamente.
non-
www
towww
w / regex en un single dedicadoserver
para todos los sitios:www
a non-www
w / regex en un single dedicadoserver
para todos los sitios:www
a non-www
w / regex en un sitio dedicado soloserver
para algunos sitios:Puede ser necesario restringir la expresión regular para cubrir sólo un par de dominios, entonces usted puede usar algo como esto para solo
www.example.org
,www.example.com
ywww.subdomain.example.net
:Prueba de expresiones regulares con nginx
Puede probar que la expresión regular funciona como se esperaba
pcretest
en su sistema, que es exactamente la mismapcre
biblioteca que su nginx usará para expresiones regulares:Tenga en cuenta que no tiene que preocuparse por los puntos finales o el caso, ya que nginx ya se encarga de eso, según el nombre del servidor nginx regex cuando el encabezado "Host" tiene un punto final .
Asperjar
if
dentro deserver
HTTPS existente :Esta solución final generalmente no se considera la mejor práctica, sin embargo, todavía funciona y hace el trabajo.
De hecho, si está utilizando HTTPS, entonces esta solución final puede resultar más fácil de mantener, ya que no tendría que copiar y pegar un montón de directivas SSL entre las diferentes
server
definiciones, y en su lugar podría colocar los fragmentos solo en los servidores necesarios, lo que facilita la depuración y el mantenimiento de sus sitios.no
www
awww
:www
a no-www
:codificar un solo dominio preferido
Si desea un poco más de rendimiento, así como la consistencia entre múltiples dominios que un solo
server
puede usar, aún podría tener sentido codificar explícitamente un solo dominio preferido:Referencias
fuente
Esta solución proviene de mi experiencia personal. Utilizamos varios cubos de Amazon S3 y un servidor para redirigir
non-www
awww
nombres de dominio para que coincidan con la política de encabezado "Host" de S3 .Usé la siguiente configuración para el servidor nginx :
Esto coincide con todos los nombres de dominio apuntados al servidor comenzando con lo que sea pero
www.
y redirige awww.<domain>
. De la misma manera, puede hacer una redirección opuesta dewww
anon-www
.fuente
listen 80
es necesario agregarlisten 443 ssl
y, a continuaciónssl_certificate
yssl_certificate_key
directivas.listen 443 ssl
con el certificado faltante. Eso no funcionará y está causando un fuerte dolor de cabeza.Combiné la mejor de todas las respuestas simples, sin dominios codificados.
Redirección permanente 301 de no www a www (HTTP o HTTPS):
Si prefiere no HTTPS, no www a HTTPS, redireccione www al mismo tiempo:
fuente
Redirigir no www a www
Para dominio único:
Para todos los dominios:
Redirigir www a no www Para dominio único:
Para todos los dominios:
fuente
80
y443
?listen
directivas para mí (nginx 1.4.6).prueba esto
Otra forma: Nginx no-www a www
y www a no-www
fuente
Formato único:
fuente
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
fuente
$scheme://www.domain.com$1
para evitar el doble corteNo estoy seguro si alguien se da cuenta de que puede ser correcto devolver un 301, pero los navegadores se ahogan al hacerlo
es más rápido que:
fuente
Blog fantasma
Para que el método recomendado de nginx
return 301 $scheme://example.com$request_uri;
funcione con Ghost, deberá agregar su bloque de servidor principal:fuente
Si no desea codificar el nombre de dominio, puede usar este bloque de redireccionamiento. El dominio sin el www principal se guarda como variable
$domain
que se puede reutilizar en la instrucción de redireccionamiento.REF: Redirigir un subdominio con una expresión regular en nginx
fuente
fuente
Si tiene problemas para que esto funcione, es posible que deba agregar la dirección IP de su servidor. Por ejemplo:
donde XXX.XXX.XXX.XXX es la dirección IP (obviamente).
Nota: ssl crt y la ubicación de la clave se deben definir para redirigir correctamente las solicitudes https
No olvide reiniciar nginx después de realizar los cambios:
fuente
/etc/init.d/nginx reload
también puedereload
usar el servidor, lo que no causa ningún tiempo de inactividad.