Nginx no-www www www y sin www
Estoy usando nginx en Rackspace cloud siguiendo un tutorial y habiendo buscado en la red y hasta ahora no puedo ordenarlo.
Quiero www.mysite.com para ir a mysite.com como normal .htaccess por SEO y otras razones.
My / 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é. Los dos segundos intentos dan errores de bucle de redirección.
if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}
Mi DNS está configurado como 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
(IPs y carpetas de ejemplo se han utilizado para ejemplos y para ayudar a las personas en el futuro). Yo uso Ubuntu 11.
15 answers
Solución HTTP
De la documentación , "la forma correcta es definir un servidor separado para example.org":
server {
listen 80;
server_name example.com;
return 301 http://www.example.com$request_uri;
}
server {
listen 80;
server_name www.example.com;
...
}
Solución HTTPS
Para aquellos que quieren una solución que incluya https://
...
server {
listen 80;
server_name www.domain.com;
# $scheme will get the http protocol
# and 301 is best practice for tablet, phone, desktop and seo
return 301 $scheme://domain.com$request_uri;
}
server {
listen 80;
server_name domain.com;
# here goes the rest of your config file
# example
location / {
rewrite ^/cp/login?$ /cp/login.php last;
# etc etc...
}
}
Nota: No he incluido originalmente https://
en mi solución ya que usamos loadbalancers y nuestro servidor https:// es un servidor de pago SSL de alto tráfico: no mezclamos https:// y http://.
Para comprobar la versión de nginx, utilice nginx -v
.
Strip www from url with nginx redirect
server {
server_name www.domain.com;
rewrite ^(.*) http://domain.com$1 permanent;
}
server {
server_name domain.com;
#The rest of your configuration goes here#
}
Por lo que necesita tener DOS códigos de servidor.
Añadir la www a la url con nginx redirect
Si lo que necesita es lo contrario, redirigir desde domain.com to www.domain.com, puedes usar esto:
server {
server_name domain.com;
rewrite ^(.*) http://www.domain.com$1 permanent;
}
server {
server_name www.domain.com;
#The rest of your configuration goes here#
}
Como se puede imaginar, esto es justo 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 permanente completa y se mueve. El no WWW es forzado y el directorio se muestra!
Parte de mi código se muestra a continuación para una mejor vista:
server {
server_name www.google.com;
rewrite ^(.*) http://google.com$1 permanent;
}
server {
listen 80;
server_name google.com;
index index.php index.html;
####
# now pull the site from one directory #
root /var/www/www.google.com/web;
# done #
location = /favicon.ico {
log_not_found off;
access_log off;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-19 17:32:15
En realidad ni siquiera necesitas una reescritura.
server {
#listen 80 is default
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
#listen 80 is default
server_name example.com;
## here goes the rest of your conf...
}
Como mi respuesta está recibiendo más y más votos positivos, pero lo anterior también. Nunca debe usar un rewrite
en este contexto. ¿Por qué? Porque nginx tiene que procesar e iniciar una búsqueda. Si utiliza return
(que debería estar disponible en cualquier versión de nginx) detiene directamente la ejecución. Esto es preferible en cualquier contexto.
Redirigir ambos, no SSL y SSL a su contraparte no www:
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate path/to/cert;
ssl_certificate_key path/to/key;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80;
listen 443 ssl;
server_name example.com;
ssl_certificate path/to/cert;
ssl_certificate_key path/to/key;
# rest goes here...
}
La variable $scheme
solo contendrá http
si su servidor solo está escuchando en el puerto 80 (predeterminado) y la opción escuchar no contiene la palabra clave ssl
. No usar la variable no le dará ningún rendimiento.
Tenga en cuenta que necesita incluso más bloques de servidor si utiliza HSTS, porque las cabeceras HSTS no deben enviarse a través de conexiones no cifradas. Por lo tanto, necesita bloques de servidor sin cifrar con redirecciones y bloques de servidor encriptados con redirecciones y encabezados HSTS.
Redirigir todo a SSL (configuración personal en UNIX con IPv4, IPv6, SPDY,...):
#
# Redirect all www to non-www
#
server {
server_name www.example.com;
ssl_certificate ssl/example.com/crt;
ssl_certificate_key ssl/example.com/key;
listen *:80;
listen *:443 ssl spdy;
listen [::]:80 ipv6only=on;
listen [::]:443 ssl spdy ipv6only=on;
return 301 https://example.com$request_uri;
}
#
# Redirect all non-encrypted to encrypted
#
server {
server_name example.com;
listen *:80;
listen [::]:80;
return 301 https://example.com$request_uri;
}
#
# There we go!
#
server {
server_name example.com;
ssl_certificate ssl/example.com/crt;
ssl_certificate_key ssl/example.com/key;
listen *:443 ssl spdy;
listen [::]:443 ssl spdy;
# rest goes here...
}
Supongo que puedes imaginar otros compuestos con este patrón ahora por ti mismo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-22 12:39:30
Puede descubrir que desea usar la misma configuración para más dominios.
El siguiente fragmento elimina www antes de cualquier dominio:
if ($host ~* ^www\.(.*)$) {
rewrite / $scheme://$1 permanent;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-15 13:09:38
Aquí está cómo hacerlo para varios nombres de servidor www a no-www (usé esto para subdominios):
server {
server_name
"~^www\.(sub1.example.com)$"
"~^www\.(sub2.example.com)$"
"~^www\.(sub3.example.com)$";
return 301 $scheme://$1$request_uri ;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-10 17:00:29
Necesita dos bloques de servidor.
Pon esto en tu archivo de configuración eg /etc/nginx/sites-available/sitename
Digamos que decides tener http://example.com como dirección principal a utilizar.
Su archivo de configuración debería tener este aspecto:
server {
listen 80;
listen [::]:80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80;
listen [::]:80;
server_name example.com;
# this is the main server block
# insert ALL other config or settings in this server block
}
El primer bloque del servidor contendrá las instrucciones para redirigir cualquier solicitud con el prefijo 'www'. Escucha las solicitudes de la URL con el prefijo ' www ' y redirecciones.
No hace otra cosa.
El segundo bloque de servidor mantenga su dirección principal: la URL que desea usar. Todos los demás ajustes van aquí como root
, index
, location
, etc. Compruebe el archivo predeterminado para estas otras configuraciones que puede incluir en el bloque de servidor.
El servidor necesita dos registros DNS A.
Name: @ IPAddress: your-ip-address (for the example.com URL)
Name: www IPAddress: your-ip-address (for the www.example.com URL)
Para ipv6 cree el par de registros AAAA usando su dirección-ipv6 -.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-18 02:07:53
Esta solución viene de mi experiencia personal. Utilizamos varios buckets de Amazon S3 y un servidor para redirigir non-www
a www
nombres de dominio para que coincidan con la política de encabezado "Host" de S3.
Usé la siguiente configuración para servidor nginx :
server {
listen 80;
server_name ~^(?!www\.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}
Esto coincide con todos los nombres de dominio que apuntan al servidor comenzando con lo que sea excepto www.
y redirige a www.<domain>
. De la misma manera puedes hacer redireccionamiento opuesto de www
a non-www
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-16 15:44:33
Prueba esto
if ($host !~* ^www\.){
rewrite ^(.*)$ https://www.yoursite.com$1;
}
Otra manera: Nginx no-www a www
server {
listen 80;
server_name yoursite.com;
root /path/;
index index.php;
return 301 https://www.yoursite.com$request_uri;
}
Y www a no-www
server {
listen 80;
server_name www.yoursite.com;
root /path/;
index index.php;
return 301 https://yoursite.com$request_uri;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-25 17:38:12
Formato único:
server {
listen 80;
server_name "~^www\.(.*)$" ;
return 301 https://$1$request_uri ;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-19 16:01:47
Redireccionar no www a www
Para Un Solo Dominio:
server {
server_name example.com;
return 301 $scheme://www.example.com$request_uri;
}
Para Todos los Dominios:
server {
server_name "~^(?!www\.).*" ;
return 301 $scheme://www.$host$request_uri;
}
Redireccionar www a no www Para Dominio Único:
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
Para Todos los Dominios:
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 07:19:11
Combiné lo mejor de todas las respuestas simples, sin dominios codificados.
301 redirección permanente de no www a www (HTTP o HTTPS):
server {
if ($host !~ ^www\.) {
rewrite ^ $scheme://www.$host$request_uri permanent;
}
# Regular location configs...
}
Si prefiere no-HTTPS, no-www a HTTPS, www redirigir al mismo tiempo:
server {
listen 80;
if ($host !~ ^www\.) {
rewrite ^ https://www.$host$request_uri permanent;
}
rewrite ^ https://$host$request_uri permanent;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-25 02:56:30
location / {
if ($http_host !~ "^www.domain.com"){
rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-23 17:09:50
No estoy seguro de si alguien se da cuenta de que puede ser correcto devolver un 301, pero los navegadores se ahogan en él para hacer
rewrite ^(.*)$ https://yoursite.com$1;
Es más rápido que:
return 301 $scheme://yoursite.com$request_uri;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-04 01:33:15
Blog de fantasmas
Para hacer que el método recomendado de nginx con return 301 $scheme://example.com$request_uri;
funcione con Ghost, deberá agregar en su bloque de servidor principal:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_pass_header X-CSRF-TOKEN;
proxy_buffering off;
proxy_redirect off;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-15 15:58:51
if ($host ~* ^www.example.com$) {
return 301 $scheme://example.com$request_uri;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-10 21:36:31
Si tiene problemas para que esto funcione, es posible que deba agregar la dirección IP de su servidor. Por ejemplo:
server {
listen XXX.XXX.XXX.XXX:80;
listen XXX.XXX.XXX.XXX:443 ssl;
ssl_certificate /var/www/example.com/web/ssl/example.com.crt;
ssl_certificate_key /var/www/example.com/web/ssl/example.com.key;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
Donde XXX. XXX. XXX. XXX es la dirección IP (obviamente).
Nota: ssl crt y la ubicación clave deben definirse para redirigir correctamente las solicitudes https
No olvide reiniciar nginx después de realizar los cambios:
service nginx restart
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-28 21:36:36