O reescrito deve ser ou: como apenas uma das condições normalmente será verdadeira a qualquer momento. No entanto, isso precisaria de uma sintaxe adicional na forma da diretiva OR: Pode reduzir o rewriteRule para uma regra de múltiplos RewriteConds para 301 no htaccess?
O primeiro reescrito verifica se o protocolo usado pela conexão não é https. Se isso for resolvido como verdadeiro, um redirecionamento para https será enviado para o cliente.
O segundo reescrito verifica se o ssl já foi terminado (por exemplo, no balanceador de carga), no qual um cabeçalho http proto x-forwarded teria sido injetado com o valor de https. Se o valor do cabeçalho não for https, um redirecionamento para https será enviado ao cliente.
Remover a primeira condição ao conectar-se diretamente ao servidor resultará em um loop de redirecionamento.
A remoção da segunda condição durante a conexão através do balanceador de carga (ou qualquer nó externo que faça a terminação) também resultará em um loop de redirecionamento.
Eu tentaria (não testado como estou em um iphone):
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]