htaccess redirecciona a https: // www

Tengo el siguiente código htaccess:

 RewriteEngine On RewriteCond !{HTTPS} off RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]  

Quiero que mi sitio sea redirigido a https://www. con HTTPS y haciendo cumplir la www. subdominio, pero cuando tengo acceso a http://www. (sin HTTPS), no me redirecciona a https://www con HTTPS.

Para forzar primero a HTTPS, debe verificar la variable de entorno correcta %{HTTPS} off , pero la regla anterior debe ser anterior a www. Ya que tiene una segunda regla para hacer cumplir www. , no lo use en la primera regla.

 RewriteEngine On RewriteCond %{HTTPS} off # First rewrite to HTTPS: # Don't put www. here. If it is already there it will be included, if not # the subsequent rule will catch it. RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Now, rewrite any request to the wrong domain to use www. # [NC] is a case-insensitive match RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Acerca del proxying

Cuando se encuentran detrás de algunas formas de proxy, mediante las cuales el cliente se conecta mediante HTTPS a un proxy, equilibrador de carga, aplicación Passenger, etc., la variable %{HTTPS} puede que nunca esté on y cause un bucle de reescritura. Esto se debe a que su aplicación está recibiendo realmente tráfico HTTP simple aunque el cliente y el proxy / equilibrador de carga estén usando HTTPS. En estos casos, compruebe el encabezado X-Forwarded-Proto lugar de la variable %{HTTPS} . Esta respuesta muestra el proceso apropiado

La respuesta de Michals funcionó para mí, aunque con una pequeña modificación:

Problema:

cuando tiene un certificado de seguridad de sitio único , un navegador que intenta acceder a su página sin https: // www. (o cualquiera que sea el dominio que cubre su certificado) mostrará una fea pantalla roja de advertencia antes incluso de recibir el redireccionamiento a la página https segura y correcta.

Solución

Primero use el redireccionamiento a www (o cualquier dominio que esté cubierto por su certificado) y solo luego realice el redireccionamiento de https. Esto asegurará que sus usuarios no se enfrenten a ningún error porque su navegador ve un certificado que no cubre la url actual.

 #First rewrite any request to the wrong domain to use the correct one (here www.) RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] #Now, rewrite to HTTPS: RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Si está utilizando CloudFlare o un CDN similar, obtendrá un error de bucle infinito con las soluciones% {HTTPS} proporcionadas aquí. Si eres un usuario de CloudFlare necesitarás usar esto:

 RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

¡MALA SOLUCIÓN Y POR QUÉ!

Cuando usas este código:

 RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.example.com%{REQUEST_URI} [L,R=301] 

el navegador va a:

 http://example.com 

luego redirige a:

 https://example.com 

luego redirige a:

 https://www.example.com 

Esto es demasiada solicitud al servidor


MEJOR SOLUCIÓN Y LA RESPUESTA

Este código tiene una condición [OR] para evitar cambios duales en la url.

 RewriteEngine on RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L] 

La mayoría de las respuestas incluso aceptaron una, no uses este truco.

Hay muchas soluciones por ahí. Aquí hay un enlace a la wiki de Apache que trata este problema directamente.

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

 RewriteEngine On # This will enable the Rewrite capabilities RewriteCond %{HTTPS} !=on # This checks to make sure the connection is not already HTTPS RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] # This rule will redirect users from their original location, to the same location but using HTTPS. # ie http://www.example.com/foo/ to https://www.example.com/foo/ # The leading slash is made optional so that this will work either in httpd.conf # or .htaccess context 

Esta es la mejor forma que encontré para Proxy y no para usuarios proxy

 RewriteEngine On ### START WWW & HTTPS # ensure www. RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # ensure https RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ### END WWW & HTTPS 

Para redirigir http: // o https: // a https: // www , puede usar la siguiente regla en todas las versiones de apache:

 RewriteEngine on RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R] 

Apache 2.4

 RewriteEngine on RewriteCond %{REQUEST_SCHEME} http [OR] RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R] 

Tenga en cuenta que la variable% {REQUEST_SCHEME} está disponible para su uso desde apache 2.4 .

Si está en CloudFlare, asegúrese de usar algo como esto.

 # BEGIN SSL Redirect  RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]  # END SSL Redirect 

Esto lo salvará del ciclo de redirección y redirigirá su sitio a SSL de manera segura.

PD: ¡Es una buena idea si comprueba el mod_rewrite.c!

Establecer en su archivo .htaccess

 RewriteEngine On RewriteCond %{HTTP_HOST} !^www. RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Intento primero responder y no funciona … Este trabajo:

  RewriteEngine On RewriteBase / RewriteCond %{ENV:HTTPS} !=on RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L] # BEGIN WordPress  RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]  # END WordPress 

Esto funcionará tanto para https como para www

 RewriteCond %{HTTPS} !=on # This checks to make sure the connection is not already HTTPS RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]