2010-07-13 13 views
19

quiero redireccionar cualquier tráfico que va a http://example.com a https://example.comnecesidad de desviar todo el tráfico a https

mismo para http://example.com/about-

pensé que sería algo como esto:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC] 
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] 
+1

Utilice example.com para todos los problemas de dominio si no desea utilizar su dominio real. – animuson

+0

Posible duplicado de [Cómo redirigir todas las solicitudes HTTP a HTTPS] (http://stackoverflow.com/questions/4083221/how-to-redirect-all-http-requests-to-https) – Sadurnias

Respuesta

50

Esto funciona para mí:

RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

Si el tráfico entra por HTTP no SSL, redirigirlo al equivalente HTTP de la página a la que el usuario intentaba acceder originalmente. Tampoco involucra ninguna opción mod_rewrite, por lo que es fácil de leer.

Raya lateral: ¿por qué todos sienten la necesidad de establecer explícitamente el código HTTP de la redirección y marcar una de sus reescrituras como la "última"? En serio, he visto docenas de reglas de htaccess similares en los últimos días.

+2

Creo que si la reescritura es acción "correctiva", la respuesta 301 es probablemente más apropiada que la respuesta 302 predeterminada, y requiere una declaración explícita. En lo que respecta a la 'L', no es necesario que no tenga ninguna otra regla coincida, pero si lo hace podría evitar fácilmente la redirección al borrar la nueva información del esquema/host. Teniendo en cuenta que la mayoría de las personas "olvidan" publicar el resto de sus reglas la mitad del tiempo, es la opción más segura. Sin embargo, si no hay más reglas, estoy de acuerdo en que es un desorden, y realmente no lo entiendo cuando lo usan en la única regla en el archivo ... –

+1

Si bien esto parece funcionar, está mal: eso porque esto depende del encabezado "Host", que es enviado por el cliente. Además, el encabezado del host también podría contener el puerto: por lo tanto, si el encabezado del host en la solicitud del cliente contiene el puerto: 80, la ubicación tendrá el puerto: 80, con https, lo cual es incorrecto. Ver http://serverfault.com/questions/814153/apache-returning-wrong-location-header. La respuesta de t-richards http://stackoverflow.com/a/27930928/1504300 parece mejor – reallynice

+0

@reallynice, también podría codificar el encabezado de host, ¿verdad? Para servidores donde solo hay uno. A menudo es posible que no tenga acceso al archivo de configuración principal del servidor, pero tiene derechos de .htaccess, por lo que en esos casos solo usaría esto, pero codificaría el host. – eis

7

De acuerdo con Apache documentation, usar mod_alias es más apropiado que mod_rewrite para esta tarea. Es decir, con el fin de redirigir todo el tráfico HTTP a HTTPS, uno haría:

<VirtualHost *:80> 
    ServerName www.example.com 
    Redirect permanent/https://www.example.com/ 
</VirtualHost > 

<VirtualHost *:443> 
    ServerName www.example.com 
    # ... SSL configuration goes here 
</VirtualHost > 

Dos cosas a tener en cuenta sobre esta configuración:

  1. Es necesario tener acceso al archivo de configuración del servidor principal para que este configuración para trabajar. La directiva VirtualHost solo es válida en el contexto de "configuración del servidor".
  2. Tenga en cuenta que las directivas mod_rewrite se procesan antes que las directivas mod_alias. Si ya tiene un bloque masivo de RewriteRule s en su archivo .htaccess, puede que esté mejor con la configuración mod_rewrite.
+0

En mi caso, el "redireccionamiento permanente" tenía que ser: 'Redirigir permanente http://www.example.com https: // www.example.com' De lo contrario, en el navegador me sale un error de bucle –

8

Esta es una previous answer using .httaccess pero la adición de los cambios propuestos en los comentarios, y algunos de mí:

RewriteEngine on 
RewriteBase/
RewriteCond %{HTTPS} !on 
RewriteRule (.*) https://my.domain.name%{REQUEST_URI} [L,R=301] 

Notas:

  • Esto es para los casos en los que el usuario no tiene acceso a la configuración principal, pero tiene acceso a las reglas .htaccess. Si tiene acceso a la configuración principal, use mod_alias solution instead.
  • Para mí, la regla no se recogió sin definir RewriteBase. Definirlo explícitamente elimina la ambigüedad con algunas configuraciones de servidor.
  • Al menos en algunas configuraciones, %{HTTPS} no está configurado en off cuando se usa http, pero es nulo, por lo que !on es una regla más confiable que off.
  • Para el nombre de host explícito, no depende de la configuración del servidor o del encabezado de host del lado del cliente. Sin embargo, el nombre de host explícito supone por naturaleza que solo hay un dominio para redirigir. El encabezado del host plantea algunos problemas considerables, como contener el puerto y ser datos suministrados por el cliente. Otra alternativa, como sugiere Apache Wiki, es usar %{SERVER_NAME}. Si considera usarlo, consulte la advertencia de this discussion; se basa en que la otra configuración es correcta.
  • R=301 significa que es una redirección permanente, ya que generalmente está destinado a ser en este caso. Si en cambio piensa que es temporal, puede omitirse o especificarse como R=302.
  • L significa que es la última regla que debe aplicarse para esta solicitud. Déjalo si sospechas o sabes que hay otras reglas después de esto que no quieres que te apliquen. Puede eliminar si esta es la única regla del archivo.
Cuestiones relacionadas