No estoy seguro si esto es lo que quiere, pero no es este
RewriteEngine on
# Test if SNI will work and if not redirect to too old browser page
RewriteCond %{HTTPS} on
RewriteCond %{SSL:SSL_TLS_SNI} =""
RewriteRule^http://www.example.com/too-old-browser [L,R=307]
Si un navegador antiguo trató de usar un sitio que necesita SNI entonces será redirigido (en este caso de nuevo a http y una página que dice navegador es demasiado viejo). Pero siempre obtendrás un error. No puede ser evitado. El navegador dice hola IP ...., y apache responde hola aquí está mi certificado. Si el navegador no proporciona SNI en el hello apache, solo envía un certificado predeterminado (es decir, erróneo). El navegador luego se queja.
Si desea recoger esto en http antes de intercambiar a https entonces se podría poner algo como esto en .htaccess
#Set $_SERVER['SSL_TLS_SNI'] for php = %{SSL:SSL_TLS_SNI} or value
SetEnv SSL_TLS_SNI %{SSL:SSL_TLS_SNI}
Y luego, en su página de hacer un https obtenerlo desde el dominio predeterminado (por defecto para el navegador no dice que hay un error de seguridad). Si SNI está funcionando, en php $ _SERVER ['SSL_TLS_SNI'] tendrá el nombre de dominio, de lo contrario tendrá% {SSL: SSL_TLS_SNI}. Este fragmento de código podría mejorarse pero se entiende la idea.
Debe asegurarse de que, en caso de que no haya SNI, el servidor informe www.example.com. Si recuerdo correctamente, Apache sirve el ** primer ** certificado que cargó cuando no hay SNI. – Andreas
Sí, eso es lo que quería decir con la solución alternativa: el valor predeterminado. Si es necesario, puede conectarse a ambos y comparar lo que obtiene. – Bruno
Eso suena como una buena idea. Voy a probarlo, esto funcionaría para mí. –