htaccess redirige a https: // www

309

Tengo el siguiente código htaccess:

<IfModule mod_rewrite.c>

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]

</IfModule>

Quiero que mi sitio sea redirigido https://www.con HTTPS y aplique el www.subdominio, pero cuando accedo http://www.(sin HTTPS), no me redirige https://wwwcon HTTPS.

gran Ben
fuente
Debería serRewriteCond %{HTTPS} =off
Michael Berkowski
1
Si hago eso, redirige a https: / / ww ww w w.
bigben
Estimado @bigben, has aceptado una respuesta incorrecta aquí. puedes averiguar por qué está mal en mi respuesta .
Amir Fo

Respuestas:

632

Para forzar primero HTTPS, debe verificar la variable de entorno correcta %{HTTPS} off, pero su regla anterior antepone el www.Dado que tiene una segunda regla para aplicar www., no la 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]

Sobre la representación

Cuando está detrás de algunas formas de representación, por medio de las cuales el cliente se conecta a través de HTTPS a un proxy, equilibrador de carga, aplicación de Pasajero, etc., la %{HTTPS}variable nunca puede estar ony causar un ciclo de reescritura. Esto se debe a que su aplicación en realidad está recibiendo tráfico HTTP simple a pesar de que el cliente y el proxy / equilibrador de carga están utilizando HTTPS. En estos casos, verifique el X-Forwarded-Protoencabezado en lugar de la %{HTTPS}variable. Esta respuesta muestra el proceso apropiado.

Michael Berkowski
fuente
14
En algunos casos, su certificado solo puede ser bueno para un solo dominio (podría funcionar con www, pero no sin, por ejemplo). En tales casos, redirija primero al dominio correcto, luego redirija a https; de lo contrario, recibirá un mensaje de error de certificado en su navegador.
Nick Benson
19
Cuando utilicé RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]una URL como exaple.com/?bla=%20 se convirtió en exaple.com/?bla=%2520 , es decir, el signo de porcentaje se ha codificado. Considere usar la bandera NEpara evitar la doble codificación:RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
Beat
55
Esto me da un bucle de redireccionamiento en un servidor, funciona en otro. Realmente no sé por qué
user151496
44
@ user151496 ¿El servidor que falla utiliza algún tipo de proxy HTTP, como pasar a través de un caché de Varnish o en Passenger? Si es así, es posible que deba verificar el X-Forwarded-Protoencabezado para verificar HTTPS en lugar de la %{HTTPS}variable. No dijiste qué parte causa el bucle, wwwo la parte HTTPS, pero eso es lo primero que me viene a la mente.
Michael Berkowski
55
Estrictamente hablando, las dos reglas que tiene arriba están en el orden incorrecto. Si entra una solicitud http://example.com(es decir, HTTP y no www), obtendrá una doble redirección. Primero a https://example.com(la primera regla) y luego a https://www.example.com(la segunda regla). Puede solucionar esto simplemente invirtiendo estas dos reglas, ya que ambas reglas redirigen a HTTPS independientemente.
MrWhite
148

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

Problema:

cuando tiene un solo certificado de seguridad del sitio , un navegador que intenta acceder a su página sin https: // www. (o cualquier dominio que cubra su certificado) mostrará una pantalla de advertencia roja fea incluso antes de que reciba la redirección a la página https segura y correcta.

Solución

Primero use el redireccionamiento a www (o el dominio que esté cubierto por su certificado) y solo luego realice el redireccionamiento 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]
Larzan
fuente
55
+1 porque es la mejor opción para este escenario, pero tenga en cuenta que esto no evitará que ocurra el mismo problema si el cliente accede https://example.com, pero en mi opinión, ese es el formato menos probable que un usuario escriba. (La respuesta aceptada también tendrá el mismo problema)
Joshua Goossen
@Larzan: Eso está mal. La excepción de certificación ocurre solo porque haces 2 redirecciones reales . Reemplace "[L, R = 301]" con "[R = 301]". Entonces, las reglas no se anulan. L = ÚLTIMO
defim
Si necesita manejar https://sin wwwtener un certificado solo en el www, simplemente agregue esta regla a la solución: RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301] simplemente vuelve a httpcuando intenta conectarse https://example.compara evitar un error de certificado.
Eric Burel
1
Las dos reglas deben revertirse de todos modos (como lo ha hecho), para evitar una doble redirección al solicitar http://example.com(es decir, HTTP y no www)
MrWhite
@EricBurel No puede evitar el error de cert en este caso: el protocolo de enlace SSL se produce antes de que se ejecute su código (que es el punto principal de SSL en primer lugar). Si su redirección pudo ejecutarse antes del error de certificado del navegador, implicaría que la solicitud ya se había realizado a través de una conexión insegura, lo que sería una falla fundamental en el modelo SSL.
MrWhite
99

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

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Andrés
fuente
2
Tenga en cuenta que el consejo actual en el sitio de soporte de Cloudflare es ligeramente diferente: support.cloudflare.com/hc/en-us/articles/…
ColinMcDermott
1
De acuerdo con @ h0mayun, el consejo Cloudflare da resultados en un bucle de redireccionamiento, mientras que este código funciona perfectamente. ¡Gracias!
hobailey
2
Ejecuto angularjs en ec2. Las soluciones que usan RewriteCond% {HTTPS}! = On me dan una redirección infinita (no estoy completamente seguro de por qué). Esta solución, con X-Fordered-Proto, parece hacer el truco. ¡Gracias!
Mark Watkins el
3
He modificado =httpa !=httpsnuestros ambientes. X-Forwarded-Protoencabezado no se declaró si http, también lo !=httpshizo el truco.
Johnathan Elmore
¡Gracias por esta vision! Pasé horas tratando de averiguar por qué {HTTPS}no estaba funcionando. Lo intenté {ENV:HTTPS}e incluso {SERVER_PORT} 443, pero al final fue porque necesitaba verificar los encabezados de solicitud HTTP personalizados de Cloudflare.
camslice
56

¡MALA SOLUCIÓN Y POR QUÉ!

Nunca use la solución a continuación porque cuando usa su código, es algo así como:

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

Esta es demasiada solicitud al servidor.

La mayoría de las respuestas, incluso aceptadas, tienen este problema.


MEJOR SOLUCIÓN Y LA RESPUESTA

¡Este código tiene una [OR]condición 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]
Amir Fo
fuente
3
"¡MALA SOLUCIÓN Y POR QUÉ!" - Esas reglas están en el orden incorrecto. Invierta esas dos reglas y será correcto: obtendrá solo una redirección y no dos.
MrWhite
44
Sí, el código dado da como resultado 2 redirecciones - no estoy discutiendo eso - todo lo que digo es que simplemente necesita revertir estas reglas para resolver este problema, no se requiere ningún otro cambio. (La respuesta "aceptada" es de hecho incorrecta, que parece ser a lo que se refiere, las directivas están en el orden incorrecto)
MrWhite
1
Sí @AmirForsati tiene razón. está redirigiendo dos veces y esta debería ser la respuesta aceptada.
Zakir hussain
44
Puede usar esto si desea mantener la variable de nombre de dominio:RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
I.devries
Esto me está redirigiendo wp-content/cache/page_enhanced/y luego, etc. ¿Cómo puedo arreglar esto? Editar: Parece que necesito ponerlo en la parte superior .htaccess. Gracias por el guión :)
Giacomo
35

Esta es la mejor manera 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
llioor
fuente
2
Correcto Esta es la mejor forma que encontré para Proxy y no para usuarios proxy +1
Deep 3015
1
Este es el mejor, ya que resuelve múltiples redireccionamientos 301
Niraj Chauhan
1
La mejor solución de todas.
SM Jobayer Alam
1
Gran respuesta. Este es el único que funcionó para mí. Funciona si estás detrás de Cloudflare (aunque no tengo reglas de página configuradas en Cloudflare).
jasonco
La única solución que funciona en todos mis casos. Pero, ¿y si quiero hacer de oposite y eliminar todo "www".
FedeKrum
27

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.
# i.e.  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
Vynz
fuente
Descubrí que al cambiar la condición de reescritura de RewriteCond %{HTTPS} offque RewriteCond %{HTTPS} !=onesa redirección siempre sucedería, esta parece ser la mejor respuesta para mí.
Samuel Hawksby-Robinson
¡Esta solución debe aceptarse como una respuesta correcta! ¡Trabajó para mí también!
AndrewShmig
11

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 .

Starkeen
fuente
1
¡Problema !: Si HTTP_HOST ya contiene www. pero el esquema no es HTTPS, entonces terminas con www.www. en tu anfitrión
Jpsy
@Jpsy tienes razón. He actualizado el destino de redireccionamiento. Gracias por tu contribución.
starkeen
1
Esto es casi lo que estaba buscando, pero quiero mantener el dominio genérico como en otros ejemplos. ¿Es posible?
cronoklee
8

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

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

Esto lo salvará del bucle de redireccionamiento y redirigirá su sitio a SSL de forma segura.

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

Ahmad Awais
fuente
no redirige https: // theurlwithoutwww.com a https: // www.
thesearentthedroids
En realidad, esta es la única solución que funciona si tiene algunas directivas "agregar www" de antemano. Otras soluciones me dan "a muchos redireccionamientos".
Daniel.P.
3
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
Анастасия Ермолик
fuente
2
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Notas: asegúrese de haber realizado los siguientes pasos

  1. sudo a2enmod reescribir
  2. servicio sudo apache2 reiniciar
  3. Agregue siguiente en su archivo vhost, ubicado en /etc/apache2/sites-available/000-default.conf
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

Ahora su .htaccess funcionará y su sitio redirigirá a http: // a https: // www

Kundan Roy
fuente
1

Similar a la solución de Amir Forsati htaccess redirigir a https: // www pero para el nombre de dominio variable, sugiero:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%2%{REQUEST_URI} [R=301,L]
Bernhard Bodenstorfer
fuente
0

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]
Adam Kozlowski
fuente
-2

Intento la primera respuesta y no funciona ... Este trabajo:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
Jackssn
fuente