non - nginx redirect http to https
Nginx no-www a www y www a no-www (15)
Blog de fantasmas
con el fin de hacer nginx método recomendado con return 301 $scheme://example.com$request_uri;
trabaje con Ghost que necesitará 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;
Estoy usando nginx en la nube de Rackspace siguiendo un tutorial y habiendo buscado en la red y hasta ahora no puedo solucionarlo.
Quiero que www.mysite.com vaya a mysite.com normalmente 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;
}
Yo también lo intenté. Tanto los segundos intentos dan errores de bucle de redirección.
if ($host = ''www.example.com'' ) {
rewrite ^ http://example.com$uri permanent;
}
Mi DNS se configura 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
(por ejemplo, las direcciones IP y las carpetas se han utilizado para ayudar a las personas en el futuro). Yo uso Ubuntu 11.
Solución HTTP
De la documentation , "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 incluyendo 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: originalmente no incluí 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 verificar la versión nginx, use nginx -v
.
Pele www de url con 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#
}
Así que necesitas tener DOS códigos de servidor.
Agregue el www a la url con nginx redirect
Si lo que necesita es lo contrario, para redirigir desde domain.com a www.domain.com, puede 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 puedes imaginar, esto es todo lo contrario y funciona de la misma manera que el primer ejemplo. De esta manera, no obtendrás marcas de SEO bajas, ya que se redirige y mueve por completo. ¡El WWW no es forzado y se muestra el directorio!
Algunos de mis códigos se muestran 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;
}
}
Aquí le mostramos cómo hacerlo para varios nombres de servidor www a no www (lo usé para subdominios):
server {
server_name
"~^www/.(sub1.example.com)$"
"~^www/.(sub2.example.com)$"
"~^www/.(sub3.example.com)$";
return 301 $scheme://$1$request_uri ;
}
Combiné la 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;
}
En realidad, ni siquiera necesita 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 es obtener más y más votos, pero también lo anterior. Nunca debes usar una rewrite
en este contexto. ¿Por qué? Porque nginx tiene que procesar e iniciar una búsqueda. Si usa return
(que debería estar disponible en cualquier versión de nginx), se detiene directamente la ejecución. Esto es preferido en cualquier contexto.
Redireccione 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 escucha en el puerto 80 (predeterminado) y la opción de escucha no contiene la palabra clave ssl
. No usar la variable no te dará ningún rendimiento.
Tenga en cuenta que necesita incluso más bloques de servidor si utiliza 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 redirecciones y bloques de servidor cifrados 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 solo.
Esta solución viene de mi experiencia personal. Utilizamos varios depósitos de Amazon S3 y un servidor para redireccionar non-www
nombres de dominio que non-www
a www
para que coincidan con la política de encabezado "Host" de S3 .
Utilicé la siguiente configuración para el servidor nginx :
server {
listen 80;
server_name ~^(?!www/.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}
Esto coincide con todos los nombres de dominio apuntados al servidor comenzando con cualquier cosa, pero www.
y redirige a www.<domain>
. De la misma manera, puede hacer una redirección opuesta de www
a non-www
.
Formato único:
server {
listen 80;
server_name "~^www/.(.*)$" ;
return 301 https://$1$request_uri ;
}
Necesitas dos bloques de servidor.
Póngalos en su archivo de configuración, por ejemplo, /etc/nginx/sites-available/sitename
Digamos que usted decide tener http://example.com como la dirección principal a usar.
Su archivo de configuración debería verse así:
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 de servidor contendrá las instrucciones para redirigir cualquier solicitud con el prefijo ''www''. Escucha las solicitudes de la URL con el prefijo ''www'' y las redirecciones.
No hace nada más.
El segundo bloque de servidor tendrá su dirección principal, la URL que desea usar. Todas las demás configuraciones van aquí como root
, index
, location
, etc. Verifique el archivo predeterminado para estas otras configuraciones que puede incluir en el bloque del 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.
No estoy seguro si alguien notó que puede ser correcto devolver un 301 pero los navegadores se ahogan en hacerlo
rewrite ^(.*)$ https://yoursite.com$1;
es más rápido que:
return 301 $scheme://yoursite.com$request_uri;
Puede descubrir que desea utilizar la misma configuración para más dominios.
El siguiente fragmento elimina www antes de cualquier dominio:
if ($host ~* ^www/.(.*)$) {
rewrite / $scheme://$1 permanent;
}
Si tiene problemas para hacer 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 de la clave deben definirse para redirigir correctamente las solicitudes https
No olvides reiniciar nginx después de hacer los cambios:
service nginx restart
prueba esto
if ($host !~* ^www/.){
rewrite ^(.*)$ https://www.yoursite.com$1;
}
Otra forma: Nginx no-www to 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;
}
Redirigir non-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;
}
Redirigir 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 ;
}
if ($host ~* ^www.example.com$) {
return 301 $scheme://example.com$request_uri;
}
location / {
if ($http_host !~ "^www.domain.com"){
rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect;
}
}