É possível redirecionar http para https usando um ErrorDocument personalizado.
Ter o servidor web inteiro rodando tanto no http quanto no https não é possível na versão atual do Apache.
Infelizmente, há um bug no Apache 2.2-16 que ainda não foi corrigido, pois o redirecionamento só funciona no Apache 2.4.
Para mais informações, dê uma olhada aqui: link
Atualizar
Aqui está um fragmento de prova de conceito que testet com o apache 2.4:
<?php
if ($_SERVER["REDIRECT_STATUS"] == "400" && preg_match("/.*?Reason: You're speaking plain HTTP to an SSL-enabled server port\..*/", $_SERVER["REDIRECT_ERROR_NOTES"])) {
header("Location: https://localhost:999");
} else {
//echo normal error message
}
?>
Use-o definindo ErrorDocument 400 /redirect-400-error.php
no seu arquivo de configuração do apache.
Você pode encontrar mais informações sobre a implementação de ErrorDocuments personalizados aqui