Tengo un error al intentar redirigir https://example.com a https://www.example.com .
Cuando voy a https://example.com , no se redirige y devuelve el estado de la página / 200.
No quiero esto, quiero que redirija a https://www.example.com .
Cuando voy a http://example.com , redirige a https://www.example.com
¿Alguien puede decirme dónde me estoy equivocando?
Estos son mis archivos de configuración predeterminados y default-ssl:
default.conf
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
default-ssl.conf
upstream app_server_ssl {
server unix:/tmp/unicorn.sock fail_timeout=0;
}
server {
server_name example.com;
return 301 https://www.example.com$request_uri
}
server {
server_name www.example.com;
listen 443;
root /home/app/myproject/current/public;
index index.html index.htm;
error_log /srv/www/example.com/logs/error.log info;
access_log /srv/www/example.com/logs/access.log combined;
ssl on;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /srv/www/example.com/keys/ssl.crt;
ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
ssl_ciphers AES128-SHA:RC4-MD5:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5:AES128-SHA;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;
try_files $uri/index.html $uri.html $uri @app;
# CVE-2013-2028 http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html
if ($http_transfer_encoding ~* chunked) {
return 444;
}
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server_ssl;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /home/app/example/current/public;
}
}
nginx
ssl
ssl-certificate
https
Thomas V.
fuente
fuente
Respuestas:
Te falta la
listen
directiva en el archivodefault-ssl.conf
. Agregarlisten 443;
en esta directivaPor omisión, si omite esta directiva, nginx asume que desea escuchar en el puerto 80. Aquí encontrará la documentación de este comportamiento predeterminado.
Editar: Gracias por el comentario de @TeroKilkanen.
Aquí la configuración completa para su default-ssl.conf
Nota al margen : puede reemplazar la
ssl on;
directiva con unalisten 443 ssl;
recomendación de la documentación de nginx .fuente
ssl_certificate
yssl_certificate_key
directivas en este bloque, y usarlisten 443 ssl;
para que sea un vhost SSL.default-ssl.conf
. Tal vez algún error tipográfico o de reordenamiento causó eso.Simplemente agregue una declaración if y debería estar en camino. Verifiqué los resultados en curl.exe -I y todos los casos además de https://www.example.com se tratan como 301. SSL es complicado porque se verifica antes de obtener la redirección de URL 301. Por lo tanto, obtiene errores de certificado.
Personalmente, me gusta eliminar las www del dominio, pero escribí mi código a continuación para responder a su pregunta.
fuente
La forma en que lo hago es usar una declaración if dentro del bloque del servidor SSL que redirige a https de www
Por supuesto, siempre que desee utilizar una instrucción if en un archivo de configuración nginx; deberías haber leído: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
fuente
if ($host = 'www.example.com')
no es necesaria.Es 2018 ahora y pensé darle a esta una oportunidad renovada en caso de que alguien esté buscando una solución simple.
Mi opinión sobre esto como un recién llegado es hacer las cosas lo más simples posible. Básicamente, desea redirigir tanto http://example.com como https://example.com a https : // www .example.com. Y que solo logras redirigir http://example.com
Esta es una operación bastante sencilla que requiere solo dos bloques de servidor (lo demostraré brevemente en un solo archivo de configuración)
Ahora tanto http://example.com como https://example.com deberían redirigir a https://www.example.com . Básicamente, esta configuración redirige todo lo que no sea www y / o no https a https: // www .
fuente
Para redirigir todas las solicitudes a
https://www.example
cree un bloque de servidor para la redirección y el dominio primario en su puerto SSL (generalmente 443), así como el puerto HTTP predeterminado 80
guardar y seguir con
sudo nginx -s reload
Esto redirigirá
fuente
;
en el segundo bloque de servidor en la cláusula if. Debería serreturn 301 https://www.example.com$request_uri;
http
el443
?