htaccess redirige no www a www con SSL / HTTPS

10

Quiero una regla de reescritura que redirija todo a https:// AND www .

Por ejemplo http://example.comdebería ir ahttps://www.example.com

Esto es lo que tengo:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule ^(.*)$ "https\:\/\/www\.example\.com\/$1" [R=301,L]
Será
fuente

Respuestas:

11

Encontré la solución.

Sin HSTS (redirección única):

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

Con HSTS (doble redireccionamiento):

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Será
fuente
1
Tenga en cuenta que esto resultará en una doble redirección cuando solicite http://example.com(es decir, HTTP y no www), ya que primero redirigirá a HTTPS en el mismo host (es decir, sin www) y luego redirigirá a wwwuna segunda redirección. Puede corregir esto simplemente invirtiendo estas dos reglas.
MrWhite
@MrWhite @will realmente desea una doble redirección en una https://redirección adecuada , especialmente si utiliza HSTS. De esta manera, su HSTS preferencia puede ser almacenada por el navegador tanto para sus dominios y las solicitudes posteriores siempre por defectohttps://
XSRF
@xsrf Todavía es "adecuado" (y más eficiente) tener una única redirección www y HTTPS. Solo necesita mantenerse separado cuando implementa HSTS.
MrWhite
Ambos buenos puntos de xsrf y MrWhite. He actualizado la respuesta.
Será el
@xsrf Verifiqué la doble redirección con htaccess.madewithlove.be y parece que solo redirige http: //> https: // no www .
Será el
6

Sus condiciones son implícitamente AND y su segunda condición siempre será verdadera (a menos que tenga otros dominios), por lo que sus reglas actuales solo redirigirán el tráfico que no sea SSL.

Necesita ORlas condiciones y negar la www(segunda) condición:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Si SERVER_PORTno es 443 (es decir, no es HTTPS) o el host no comienza con www.(es decir, está accediendo al dominio desnudo), entonces redirija a la URL canónica.

Sin embargo, si esto va a redirigir https://example.coma https://www.example.comdependerá de su certificado de seguridad. (Su sitio debe ser accesible tanto por www como por no www a través de SSL para que la redirección .htaccess se active).

Señor White
fuente
1

Esto se usará tanto para www como para no www. Si intenta abrir un enlace con www, entonces la URL redirige a https con www

Ejemplo: http://domain.comredirigir ahttps://domain.com

o Si intenta abrir un enlace con un sitio que no es www, entonces la URL redirige a https con un sitio que no es www

Ejemplo: http://www.domain.comredirigir ahttps://www.domain.com

RewriteEngine on

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Ajay Patidar
fuente
Esto no maneja la redirección no www a www como se indica en la pregunta.
MrWhite
Puede agregar esta línea en htaccess RewriteCond% {HTTP_HOST}! ^ Www \. RewriteRule ^ (. *) $ % {HTTP_HOST} / $ 1 [R = 301, L]
Ajay Patidar el
Reemplazar RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] porRewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [R=301,L]
Ajay Patidar
Puedes editar tu respuesta.
MrWhite