Cambiar correctamente entre HTTP y HTTPS utilizando .htaccess

Tenemos un sitio de compras que alojamos en un host compartido (Mediatemple Gridserver). Algunas partes del sitio deben usar HTTPS (pago, etc.), pero el rest debe estar usando HTTP.

¿Alguien sabe cómo siempre podemos forzar el uso correcto de HTTP / HTTPS para URL particulares? Lo hemos tenido funcionando en varios estados, pero no podemos obtener una solicitud para una página que debe estar en HTTP, pero se solicita con HTTPS para volver a cambiar correctamente.

He echado un vistazo alrededor de SO, pero no he podido encontrar una respuesta adecuada para esto.

Utilizo algo similar a esto para mi carpeta de administración en wordpress:

#redirect all https traffic to http, unless it is pointed at /checkout RewriteCond %{HTTPS} on RewriteCond %{REQUEST_URI} !^/checkout/?.*$ RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L] 

La RewriteCond %{HTTPS} on puede no funcionar para todos los servidores web. Mi RewriteCond %{HTTP:X-Forwarded-SSL} on requiere RewriteCond %{HTTP:X-Forwarded-SSL} on , por ejemplo.

Si quieres forzar el reverso, prueba:

 #redirect all http traffic to https, if it is pointed at /checkout RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} ^/checkout/?.*$ RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L] 

Si quieres algunas formas alternativas de hacerlo, mira askapache .

Esto debería funcionar en casi todos los escenarios y debería funcionar en su host virtual o .htaccess:

 RewriteEngine on RewriteCond %{SERVER_PORT} ^80$ RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

(no olvides la barra antes de% {REQUEST_URI} ya que esto puede permitir pasar un número de puerto, lo cual es peligroso)

 RewriteEngine on RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

Tuve un problema al estar detrás de un miembro de la plataforma de carga. Así como lo arreglé

Como se detalla en esta respuesta , corrija su aplicación para usar enlaces https:// cuando sea necesario. No confíe en las redirecciones automáticas, esto podría llevarlo a una falsa sensación de seguridad si no ha cumplido sus enlaces / formularios en https:// vaya también a https:// URLs. Usar mod_rewrite automáticamente hace que sea más difícil detectar tales errores (que también pueden ser vulnerabilidades).

Para mí funcionó esto (lo usé para el sitio de wordpress y para redireccionar a HTTPS). Debe agregar las líneas de condición y regla justo detrás de las líneas RewriteEngine y RewriteBase:

 # BEGIN WordPress  RewriteEngine On RewriteBase / # I added these two lines for redirect to HTTPS RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L] # (end of custom modifications) RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]  # END WordPress` 

Eche un vistazo para condicionar RewriteCond %{HTTP:X-Forwarded-Proto} !https – solo esto funcionó para mi alojamiento de servidor. (Intenté RewriteCond %{SERVER_PORT} !^443$ o RewriteCond %{HTTPS} off también, pero sin éxito.

Creo que debería ser:

 RewriteCond %{HTTPS} =on ^/checkout(.*) http://shoppingsite.com/checkout$1 [R] 

Ver la documentación de mod_rewrite .